estuve revisando y puedo confirmarte que los cambios los realiza correctamente. sin embargo, me fije que en el codigo original tienes una variable temporera donde vas almacenando los cambios. pero con la solucion que te proponia no estas almacenando los cambios. a continuacion una muestra.
Código:
// codigo original;
txttmp=txttmp.replace(/\{\%c1\%\}/g, document.getElementById("cmpc1").value);
// codigo propuesto;
missing_variable txttmp.replace(/\{\%(\w+)\%\}/g, function() { return document.getElementById("cmp"+arguments[1]).value;});
a mi me funciono almacenando los cambios y operando desdes la variable txttmp. la previsualizacion me muestra todos los campos qu habia llenado.