I chose a different approach to solving this. Not sure if it's better but I'll put it up here anyway.
(function(utility) {
angular.module('app').
service('data',['$q', function($q) {
var deferred = $q.defer();
var data = ['bla', 'bla'];
//some async $http stuff being done resulting in deferred.resolve(data)
utility.add = function(stuff) {
data.push(stuff);
};
return deferred.promise;
}]).
service('dataService', [function() {
return {
add: function(data) {
utility.add(data);
};
}]);
}({}));
Basically, any controller that are just interested in my array will have data injected while anyone who is potentially interested in adding stuff to my array will have dataService injected. I then create a closure over a utility object which contains an add function that pushes stuff into the array. This works (at least on 1.0.8) as the promise keeps the reference to the original array and the resolved value is actually updated when I change the original.
This way my controller is decoupled completely from the $http and does not have to concern itself with how data is fetched from the server, it just gets it handed over by declaring it as a dependency, and I have full control over how stuff gets added. My data is also cached since the service is a singleton while the controller is not.