No JavaScript, quando uma função é chamada, ela é colocada no "Call Stack", que é uma espécie de pilha que guarda as funções que estão sendo executadas. O código dentro dessas funções é executado sequencialmente.
Quando encontramos um setTimeout, definimos um tempo para que uma determinada função seja executada após um certo período. Esse tempo começa a contar a partir do momento em que o JavaScript lê a chamada da função setTimeout.
Então, se houver outras funções no "Call Stack" sendo executadas, o setTimeout começa a contar seu tempo mesmo assim. Quando o tempo definido pelo setTimeout se esgota, a função associada a ele é movida do "Task Queue" para o "Call Stack" para ser executada, desde que o "Call Stack" esteja vazio no momento.
Isso não ocorre da mesma maneira para todos os eventos. Por exemplo, eventos como cliques de mouse e respostas de servidor são tratados de forma assíncrona, e suas funções são colocadas no "Task Queue" após sua ocorrência, independentemente do estado do "Call Stack". Essas funções no "Task Queue" esperam sua vez para serem movidas para o "Call Stack" e executadas.
Portanto, o momento em que uma função definida em um setTimeout começa a contar seu tempo é a partir do momento em que o JavaScript lê a chamada da função, e a execução dessa função ocorre quando o "Call Stack" está vazio, independentemente de outros eventos assíncronos no "Task Queue".
espero ter ajudado. :)