Node é single threaded, istoé, ele é incapaz de executar duas coisas ao mesmo tempo, com exceção de operaçes de IO.
Exemplos de operação não bloqueantes: Acesso à rede, acesso à arquivos etc.
Exemplos de açes bloqueantes: Loop num array, cálculos complexos etc.
Em node, o padrão é toda função assíncrona ter uma versão síncrona, por exemplo fs.readFile
e fs.readFileSync
.
As verses síncronas são úteis para aplicações que não dependem de concorrência, como scripts e programas de linha de comando por exemplo.
Via de regra usamos a versão assíncrona. Em uma API, por exemplo, qualquer operação bloqueante impede que novas requisiçes sejam processadas pelo servidor, por isso é importante sempre fazer chamadas não bloqueantes.