Die Idee des Nicht-Blockierens ist, dass die Schleifeniterationen schnell sind. Das Iterieren für jeden Tick sollte also so kurz sein, dass das setTimeout auf eine angemessene Genauigkeit genau ist (um etwa <100 ms oder so).
Theoretisch hast du allerdings recht. Wenn ich eine Anwendung schreibe und das Häkchen blockiere, wird setTimeouts verzögert. Um Ihre Frage zu beantworten, wer kann sicherstellen, dass setTimeouts pünktlich ausgeführt werden? Durch das Schreiben von nicht blockierendem Code können Sie den Genauigkeitsgrad bis zu nahezu jedem angemessenen Genauigkeitsgrad steuern.
Solange Javascript in Bezug auf die Codeausführung "Single-Threaded" ist (ausgenommen Web-Worker und dergleichen), wird dies immer passieren. Die Single-Thread-Natur ist in den meisten Fällen eine enorme Vereinfachung, erfordert jedoch, dass die nicht blockierende Sprache erfolgreich ist.
Probieren Sie diesen Code entweder in Ihrem Browser oder im Knoten aus, und Sie werden feststellen, dass es keine Garantie für die Richtigkeit gibt. Im Gegenteil, das setTimeout wird sehr spät sein:
var start = Date.now();
// expecting something close to 500
setTimeout(function(){ console.log(Date.now() - start); }, 500);
// fiddle with the number of iterations depending on how quick your machine is
for(var i=0; i<5000000; ++i){}
Wenn der Interpreter die Schleife nicht optimiert (was bei Chrom nicht der Fall ist), erhalten Sie Tausende. Entfernen Sie die Schlaufe und Sie werden sehen, dass es 500 auf der Nase ist ...