I've given a look at your code and I found it pretty interesting!
First of all I would suggest you to play with the timeout values, for example: I've changed the timeout value of the second controller to 1000 ms and found out that now the two companies with 'Google' where the second and the third ones.
But apart from this I've noticed that in the third controller you wrap the initialisation inside an $apply, turning the code of the third controller to this
app.controller('ThirdCtrl', function($scope, $rootScope) {
$scope.name = 'Third';
setTimeout(function() {
$scope.name = "I'm Third";
$rootScope.company = "Amazon";
$scope.$digest();
},500);
});
definitely solved the "error" for me due to the fact the $apply being called in the third controller was also updating $rootScope, doing its job properly! :D
Anyway, for this solution I wouldn't suggest you using $scope rather than $rootScope, you might experience unwanted updates and your final application might be unstable.