I think you've answered your own question, when saying that you shouldn't have the $http request in the filter.
The watching (result of the digest) works by comparing values, and often checks them multiple times, depending on whether it things things have 'settled'. If you spawn off a http request each time it is checked, then yes, you will cause a lot of requests.
You should be only watching values which exist, or WILL exist when the promise returns. Maybe just set a variable for whether your request has been sent or not. At worst, give it a timeout, to throttle the 'updates' if you want it periodically updating.