Как каждые 100 выполнений цикла, сделать timeOut и продолжить его, пока не завершится?
Для асинхронности должна быть другая логика. Нет цикла, есть функция, которая выводит очередные 100 элементов и, если элементы ещё остались, устанавливает таймер на вызов себя через заданное время.
const foo = () => {
  const max = 439;
  let counter = 0;
  const next100 = () => {
    for (let i = 0; i < 100 && counter <= max; i += 1, counter += 1) {
      console.log(counter);
    }
    if (counter !== max) {
      setTimeout(next100, 4000);
    }
  }
  setTimeout(next100, 0);
}
foo();
function* test() {
    for (let i = 1; i < 440; ++i) {
        yield i;
    }
}

const x = test();
(function start() {
    let r, v;
    while (r = x.next()) {
        if (r.done) break
        v = r.value + 1
        if (v % 100 === 0) {
            console.log(v)
            return setTimeout(start, 1000)
        }
    }
}())
Используя генераторы