Если в функции вызывается нечто асинхронное, то и сама функция может быть только асинхронной (так как нельзя вернуть то, чего пока ещё нет и оно станет известно позже). Потому делайте функцию асинхронной и передавайте в неё callback, который вызывайте уже после того, как массив errors будет окончательно сформирован (в данном случае - в самом глубоком вложенном callback'е)