Due cose:

1 - La forma utilizzata per il setTimeout, in cui richiami la funzione sotto forma di stringa, è da evitare. Probabilmente l'errore dipende da questo perché, a seconda di quello che passi come argomenti della funzione, la stringa stessa potrebbe rompersi.
Meglio usare questa sintassi (vedi documentazione):
codice:
setTimeout(macchinaDaScrivere, velocita, id_campo, testo, velocita, posizione+1);
2 - Per mostrare il testo elaborato stai usando innerHTML, suppongo si tratti di un div. All'interno di un elemento del genere, il testo viene normalmente formattato secondo le direttive HTML per cui i ritorno a capo non vengono comunque considerati, tant'è che di norma si utilizza il tag <br>. Il risultato sarà quindi un testo senza ritorno a capo (anche se ci sono nel testo iniziale), a meno che tu non abbia impostato tale elemento da CSS per fare in modo che contenga del testo preformattato.