estoy cambiando el valor de 'aa' después de 1 segundo, pero el ciclo continúa ejecutándose.
let aa = true; setTimeout(function () { aa = false; }, 1000); for (; aa; ) { console.log('aaa'); }setTimeout es asíncrono , por lo que se ejecutará solo después de que se complete la ejecución del código actual del bucle for . En tu caso será infinito.
Una vez que for loop comenzó la ejecución, permanecerá en la pila de llamadas hasta que finalice. Como no diste ninguna condición ahí no parará
Su enfoque no funciona por razones explicadas por otros. Puedes usar algo como esto en su lugar:
var started = Date.now(); while(Date.now() - started < 1000) { console.log("aaa"); };