Михаил, вызывать require внутри функции - плохая практика, т.к. поиск пути к модулю отнюдь не бесплатен и высчитывается заново при вызове require. Всегда инициализируйте модули в загловке файла. На хабре была целая статья на эту тему.
И да, в вашем примере нет глобальных переменных. Все файлы (модули) в node.js вызываются в контексте анонимной функции, в которую передаются такие аргументы, как "require", "process" и т.д.
А то, что он не возвращает ошибку в контроллер при отсутствии коннекта, это скорее всего баг mongoose. Можете создать issue на гитхабе. Может быть, они или починят, или подскажут другое решение.
Получается reconnectTries и reconnectInterval касаются случая, только если уже было установлено соединение? Как исправить все в моем случае?
Скорее всего, количество попыток истекло, и драйвер перестал пытаться подключиться к базе. Драйвер не телепат и не знает о том, что база заработает позже.
Поиск в массиве, да через for-in? При онлайне в пару тысяч такой код будет насиловать CPU по полной. Проще использовать Map или объект. В общем, этот код из серии "вредных советов" или как делать НЕ НАДО.
connection.query надо ставить либо в async.eachSeries, либо в цепочку промисов. Сейчас данный код по сути нерабочий. Это не утечка памяти, а ее лавинообразное потребление. Читайте про асинхронность.
Жесть какая. Зачем?