Нет гарантии, что карта загрузится быстрее, чем вы получите данные для меток (этого и не происходит, почему и возникает ошибка), поэтому выполнять запрос данных следует после того, как карта будет готова к использованию - т.е., в ymaps.ready.
UPD. Вынесено из комментариев:
Я так понял, вы предлагаете код, который находится в функции setMarkers() перенести в initializeYandexMap(), я прав?
Нет, не правы. Подумайте ещё. Предположим, вы так сделали. Что будет, если карта загрузится раньше, чем данные? Вы ничего не увидите, потому что массив coordinates будет пустым в момент выполнения setMarkers.
Ещё раз: выполняйте действия последовательно, а не параллельно - сначала загрузка карты, затем загрузка данных. Это самый простой вариант. Параллельная загрузка организовывается немного посложнее - надо обернуть ymaps.ready в промис, и воспользоваться Promise.all.
Как это может выглядеть -
первый вариант,
второй (запрос заменён на setTimeout, но думаю суть понятна).