Ciao, prima cosa, in questo specifico caso, per quella stringa, l'escape degli apici singoli è superfluo (anche se dovrebbe funzionare ugualmente in entrambi i casi); puoi togliere i backslash in questo punto (quelli in rosso):
codice:
onclick=\"creaElemento(\'"+valore.substring(0,valore.length-1)+"\')\">
A parte questo, la causa del problema è presumibilmente quella che hai detto tu stesso: se la variabile valore presenta degli apici (in questo caso, sia singoli sia doppi) il codice risulterà corrotto.
Se gli apici sono singoli l'errore sarà a livello di JavaScript (esattamente quello che hai riscontrato); se invece sono doppi, l'errore sarà a livello di HTML perché si romperà il valore definito come stringa dell'attributo onclick (e a quel punto il problema si ripercuoterà anche a livello di JavaScript).
Il replace che hai effettuato non funziona perché la stringa HTML restituita dalla tua funzione risulterà già interpretata da JavaScript quando viene applicata come codice HTML.
Per risolvere...
Nel caso di apice singolo (apostrofo) puoi eseguire un escape con doppio backslash. Il primo backslash serve ad effettuare l'escape del secondo; così facendo, quando viene risolto il codice HTML, resterà un backslash che a sua volta servirà per effettuare l'escape del singolo apice a livello di JavaScript.
Nel caso di doppio apice, invece, non può essere applicato questo metodo perché il parser HTML non interpreta gli escape ma sarà sufficiente sostituire tale carattere con la sua corrispondente entità HTML.
Potresti quindi risolvere applicando, alla variabile, degli specifici replace per ciascuno dei due casi, in un modo del genere:
codice:
valore.substring(0,valore.length-1).replace(/'/g,"\\'").replace(/"/g,'"')
Prova e fai sapere