ich lasse die Schleife nicht bis zum Ende laufen, sondern nur eine begrenzte Zeit, z.B. eine Sekunde. Wenn die Zeit um ist, die Aufgabe aber noch nicht erledigt, merke ich mir, wie weit ich gekommen bin und starte dann den nächsten Lauf per setTimeout mit 1 ms Verzögerung. So "friert" der Browser nicht ein und die Warnung kommt auch nicht.
Interessantes Workaround. 1ms Verzögerung ist aber nicht machbar:
"If the currently running task is a task that was created by the setTimeout() method, and timeout is less than 4, then increase timeout to 4." [whatwg]
Die auszuführenden Segmente sollte also nicht zu klein gewählt werden, sonst erhöht sich die Laufzeit drastisch.