Фактически, это не только задача загрузки конроллеров, но и других модулей (фабрик, директив...). При разработке первого приложения на angular тоже возник вопрос по асинхронной загрузке компонентов.
Отличный пример есть
здесь.
В общем, при конфигурировании приложения мы говорим, какие модули необходимо зарезолвить перед переходом по роуту. А динамическая загрузка ложится на плечи RequireJS.