гипотеза: при изменении DOM дерева срабатывает апишное событие, которые помещается в очередь событий с наивысшим приоритетом. Соответственно, после завершения основного потока оно срабатывает и производит некий "ремаппинг" всего DOM дерева, включая обработчики и свойства.
Это 100% не так. Я даже не понял что вы написали.
Тк как у нас 2 действия связанных с отрисовкой они оптимизируются. Именно по этому все действия с визуализацией делают как можно ближе. В вашем случае. Вы делаете перестановку дом ноды. Это вызывает перерисовку элементов. Она видит "Ага ещё и класс меняем -> сразу его меняем -> а потом рисует дом". Тк как она рисует уже с применёнными эффектами - событие не срабатывает.
Почему с таймером работает. Думаю становится понятно.
Рисуем дом->Таймер независимо срабатывает и навешивает класс->Рисуем ещё раз. Событие происходит.