Сложна, сам ещё в процессе понимания.
Там ещё действует механизм "Выполнить до завершения", операция не выйдет из цикла событий пока не выполнится и последующие задачи не начнут выполняться. Поэтому, например, фетчинг огромных данных на миллион единиц делят на более мелкие куски и фетчат по частям, перемещая в конец очереди, чтобы создать окно, в котором мелкие операции смогли выполниться.
Поэтому есть две очереди. 1 callstack для выполнения функций обратного вызова и 2 очередь для выполнения событий (xhr), фетчинг базы данных. Жс может одновременно получать данные из базы и обрабатывать ввод символов в инпут формы, благодаря этому действие программы не блокируется.