scusa ma se analizzi quello che fa il codice l' errore e' marchiano:
con createRange o selectionStart/End ti stai procurando solo una stringa (avresti lo stesso risultato se la definissi direttamente tu)
quando vai a rimpiazzare questa stringa non esiste piu' nessuna relazione tra essa e il testo selezionato
e ovviamente solo la prima occorrenza verra' rimpiazzata
ora non trovo una discussione maggiormente pertinente,
ma nel frattempo prendi spunto da questa
ciao