Я, может быть, опишу неправильно принцип работы, но визуализировать себе его можно так: Код выполняется слоями. Сначала идёт просмотр и выполнение первого слоя (в том числе инициализация функций и глобальных переменных), затем второй слой, это как раз callback-функция, которая находится в query. Соответственно, переменной result присваивается значение только на втором проходе, поэтому получаешь null.
Следовательно, всё, что находится внутри callback, там же и обрабатывается. Есть альтернатива в виде
промис, но тут уж вопрос в поставленных задачах и полученных навыках.