Вполне логичным, как мне кажется, является создание функций для загрузки необходимых данный для каждого модуля таких что повторые вызовы возвращают уже загруженные данные, а не делают их reload.
как-то так (метод модели)
loadModuleData: ->
return @deferred if @deferred?
@deferred = new $.Deferred()
// --- загрузка данных ---
collection = new SomeCollection()
collection.fetch(reset: true)
.done =>
@deferred.resolve()
.fail (resp) =>
@deferred.reject(resp)
delete @deferred
// --- загрузка данных ---
@deferred.promise()
Так вот. Перед вызовом метода показываем пользователю какой-нибудь прогрессбар или спин. Далее вызываем метод и после загрузки создаем необъодимые вьюхи/модели/коллекции/редерим все. ПОтом прячем прогрессбар/спин и пользователь видит новую страницу.