no seu exemplo, setInterval é síncrono, mas a callback que ele define não é, porque não executa em tempo real (ela aguarda 500ms). Porque não executa em tempo real (ela aguarda 500ms).
Ela não "aguarda 500ms", ela marca a execução para os próximos 500ms, tem exemplos demais sobre isso no post acima mas aqui vai mais 1:
const inicio = Date.now();
setInterval(()=>{
console.log("Temporizador 1 "+(Date.now() - inicio));
},500);
setInterval(()=>{
console.log("Temporizador 2 "+(Date.now() - inicio));
},500);
Como os resultados mostram, javascript apenas "agenda" para daqui 500ms, em assincronismo real os 500ms seriam literais, quanto mais tempo o temporizador tiver e mais coisas estiverem acontecendo mais tempo diverge, o mesmo não acontece em go
que é assincrona, com apenas 2 temporizadores já vira bagunça imagina com uns 100