Как изменить значение переменной после окончания рекурсивных вызовов setTimeout?
Вы, кажется, не понимаете асинхронной работы в JS. Функция SetTimeout не ждёт указанное время (у вас 2 секунды). Она настраивает таймер и сразу же возвращается. Указанная в SetTimeout функция через указанное время будет поставлена в очередь вызовов JS и запущена, когда до неё дойдёт очередь.
Таким образом, функция bbb, вызванная из aaa завершится практически сразу же. Вы можете записать так:function bbb() {
  if(...) {
    variable = true;
    return;
  }
  SetTimeout(bbb, 2000);
}
Но переменная изменится только по срабатыванию условия, когда функция aaa давно уже завершится.
Возвращайте из функции bbb промис.