Необходимо пробросить в `create_markers` коллбек, который будет вызыван уже после того, как данные загрузятся и объект с маркерами заполнится.
function create_markers(map, fn) {
var markers = {}
$.ajax(..., {
success: function(...) {
...
fn(markers);
}
});
}
var map = create_map();
create_markers(map, function(markers) {
// показывает, что объекты в массиве есть (об этом читайте далее)
console.log(markers);
// показывает 0 (об этом читайте далее)
console.log(markers.length);
// включает отображение маркеров
setAllMap(map, markers);
});
В вашем случае объект пустой, по причине того, что возврат из функции пустого объекта происходит раньше, чем будет получен ответ от сервера. Дальше гуглим про асинхронность в js.