In my case, I needed to watch a service, which contains an address object also watched by several other controllers. I was stuck in a loop until I added the 'true' parameter, which seems to be the key to success when watching objects.
$scope.$watch(function() {
return LocationService.getAddress();
}, function(address) {
//handle address object
}, true);