ah, br1 non ha messo la spiegazione, ma se ti interessa il motivo è soltanto che replace non trova TUTTE le occorrenze del pattern cercato, ma solo la prima, perché se gli passi una stringa di caratteri la funzione crea una RegExp a partire da essa, senza il secondo argomento ( http://www.javascriptkit.com/jsref/regexp.shtml il costrutture di RegExp prende 2 argomenti il primo la stringa il secondo il flag del tipo di ricerca) quindi è una ricerca alla prima occorrenza.

quello che passa br1, invece, è già una RegExp, con il flag g finale (che indica ricerca globale).

anche se però sono un attimo confuso dalla cosa, magari mi puoi rispondere tu br1: /\r?\n\r?/g non dovrebbe cercare tutte le occorrenze nella stringa che siano:

\r\n\r
\r\n
\n
\n\r

o mi sbaglio? se è così non capisco cosa serva lo \r? finale. C'è la possibilità che si verifichi \n\r? Perché a me sembra di no.

Io avrei fatto piuttosto:

t1.replace(/\r\n/g,"\n").replace(/\r/g, "\n").split('\n');

In modo che se ci sono dei \r\n li cambio in \n, se ci sono solo \r, li cambio in \n, ma solo dopo aver tolto i \r\n.