AngularJS does not yet have a way to load objects asynchronously, but you can use RequireJS to do it yourself. First, you need to wrap all controllers, factories, etc with AMD modules. They should look something like this:
define([
    // your dependencies
], function () {
    return ["myController", ["$scope", function($scope) {
       $scope.data = { label: "my data" };
    }]];
});
When initializing your application, do something like this:
var compileProvider,
        controllerProvider,
        filterProvider,
        provide;

    // create your application module and store references to the compileProvider, controllerProvider, filterProvider, and provider
    var module = angular.module('myApp', [], function ($compileProvider, $controllerProvider, $filterProvider, $provide) {
        compileProvider = $compileProvider;
        controllerProvider = $controllerProvider;
        filterProvider = $filterProvider;
        provide = $provide;
    });

     var lazyAngular = {
            registerFactoryProvider: function(factory) {
                provide.factory.apply(null, factory);
            },
            registerFilterProvider: function(filter) {
                filterProvider.register.apply(null, filter);
            },
            registerDirective  : function (directive) {
                compileProvider.directive.apply(null, directive);
            },
            registerController : function (controller) {
                controllerProvider.register.apply(null, controller);
            }
        };

    // Now, register a factory you can use to register lazily loaded controllers, directives, filters and factories
    module.factory("lazyAngular", function () {
        return lazyAngular ;
    });
    // Note that you can also reference the lazyAngular object directly, without dependency injection if you wish.
You can now load things asynchronously, for example:
// Make sure that you have lazyAngular in the current context (load it with dependency injection).
// Note that I have also seen developers put the registration methods in a global namespace, to easily reference the registration capability from everywhere without worrying about dependency injection.
// How you reference the lazyAngular object is up to you.
require(["myController"], function(myCtrl) {
    lazyAngular.registerController (myCtrl); // register the lazily loaded controller

   // you can now use this lazy loaded controller
});