Конструкция while (true) это идиома из синхронных языков программирования чтобы заставить что-то работать вечно. К примеру, вы пишите демон на php, и там нужно такое чтобы он всегда искал и делал, пока его не убьют через kill.
смотрите, судя по условиям, за один проход у вас может выполняться и тот, и другой метод. Из кода не ясна суть бизнес-задачи, поэтому точное решение предложить сложно. Но одно ясно - у вас классическая pub/sub задача. У вас есть хранилище заданий, которое должно пополняться и задачи из него должны выполняться. Это самая обычная FIFO-очередь. Реализовать можно как угодно: redis, rabbit, bull и т.п. Хоть даже пишете собственный объект, наследуете его от eventEmitter и реализуете его так, чтобы он сам мог генерить события.
1) создаете слушателя, который подписывается на очередь и выполняет задачи если она не пуста. Такой подход позволит запускать выполнение тасков параллельно, а не последовательно
queueObject.on('newtask', doSomeAsyncStuff(task));
2) в зависимости от вашей задачи реализуете пополнение очереди, можно хоть через setInterval
setInterval(() => {
if (queueObject.length < 10) populateQueue();
}, 1000);