Тут идея в том, что функция productRepository.getProducts выполнится мгновенно, а callback функция выполнится через некоторое время. Сначала выполнится productRepository.getProducts, затем return collection, а потом только через некоторое время callback с collection = result, но будет уже поздно.
Дальше уже решать как лучше. Можно асинхронно через callback (callback вместо return):
getAllProducts: function(callback) {
productRepository.getProducts(function(error, result) {
callback(error, result);
});
}
Можно асинхронно через promise. Возможно можно и синхронно (не проверял) - ждать перед return collection выполнения callback - но это будет программу в этот момент тормозить.