Cita: EDITO: ¿Es buen camino? ¿O con él código que llevo intentando todo el rato no podría?
no, no se puede de esa forma. fijate que la referencia $& en si no contiene el string pareado por la expresión. según como yo lo veo, replace inserta el string $& cuando tiene una coincidencia y luego internamente el motor RegExp busca las referencias especiales y las reemplazas por el contenido. este paso es un proceso interno y no se puede tocar. aqui una demostración que ese método no funciona.
Código:
"!happy o !sad".replace(/!happy|!sad/g, console.log("$&"));
"!happy o !sad".replace(/!happy|!sad/g, (function(capture){console.log(capture);})("$&"));
nótese que en ambos códigos se imprime en la consola el string "$&" en lugar del string capturado por la expresión. la única forma que funciona hacer un replace al string capturado es si en lugar de pasar un string, pasaras una función en el segundo parámetro. en los enlaces que antes señalé habla respecto el segundo argumento. no obstante, aunque es posible mediante una función, el método que señale con backreference de grupos no requiere hacer ese proceso.