В ECMA-262 цикл событий не упоминается ни разу. Спецификация определяет задания (jobs) и хост-хук HostEnqueuePromiseJob, который движок вызывает, когда реакция промиса готова к запуску. Когда эти задания на самом деле выполняются и что идёт между ними, решает хост.
Поэтому setTimeout в спецификации языка вообще нет, и спор о том, кто раньше, колбэк таймера или колбэк .then, одним чтением ECMA-262 не решить. Порядок, на который все полагаются, когда все задания промисов выполняются до следующей задачи таймера, задают цикл событий HTML и Node, а не базовая спецификация.
Разделение всё равно полезное. В пределах одного хода реакции промисов выполняются в порядке постановки в очередь, а await даже на уже разрешённом значении ждёт задание, так что код после него синхронно не выполнится никогда. В Dart та же двухуровневая схема, и работа из scheduleMicrotask идёт раньше ожидающих событий.
Хосты договорились между собой о большем, чем обязаны. Жаль только, что объяснения так часто начинаются со схемы, которую спецификация никогда не рисовала.

