Как вернуть значение из callback функции?
Могу подсказать, что, вероятнотно, вы не понимаете что такое асинхронность.
Ф-я getAllProducts должна либо принимать свой колбек, на который затем будет вброшено полученое из монги значение, либо отдавать промис, дифер которого будет резолвиться после collection = result.
Тут идея в том, что функция 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 - но это будет программу в этот момент тормозить.