setTimeout это функция браузерного апи, после её вызова основной поток выполнения освобождается, благодаря чему код на js может продолжить выполнение, а таймер продолжает работать уже в фоновом режиме, но это уже js напрямую не касается. После того как время истечет, тот коллбэк, что передается в качестве аргумента функции setTimeout, помещается в так называемую очередь макротасков, event loop или событийный цикл на каждой своей итерации извлекает задачи из этой очереди и помещает их в поток выполнения java script (где формируется стек вызовов), если, коначно, этот поток пуст.