Использование генераторов для перебираемых объектов при поиске элементов разбиралось в https://community.elma365.com/ru/threads/95/
В данном случае, поиск вынесен в метод с типизацией по элементу приложения для удобства переиспользования в решении.
	Код:
	
async function searchByGenerator<D extends ItemData, P extends ItemData>(search: ApplicationSearch<D, P>): Promise<ApplicationItem<D, P>[]> {
    // Размер пакета промисов (оптимальное значение)
    const promises_package_size = 10;
    const search_size = 1000;
    const count = await search.count();
    const generator = {
        from: 0,
        to: count,
        *[Symbol.iterator]() {
            for (let i = this.from; i <= this.to; i += search_size) {
                yield search.from(i).size(search_size).all();
            }
        }
    }
    const promises = [...generator];
    const items: ApplicationItem<D, P>[] = [];
    // Ожидание промисов по пакетам в соответствии с заданным размером пакета
    for (let i = 0; i < promises.length; i += promises_package_size) {
        const results = await Promise.all(promises.slice(i, i + promises_package_size));
        for (let result of results) {
            items.push(...result);
        }
    }
    return items;
}
 Дополнительно возможно вынести count в параметры метода, чтобы ограничивать размер получаемой выборки