Sorry I don't think I was clear with what I meant by bindings. I added a bit of code to angular's digest function to count the number of watches being run and what I meant by "40 bindings" is that each of my comments has about 40 watches being run on it per digest cycle.
The way I have designed my system allows for a lot of user interaction -- the user can vote on comments, give points to other users for helpful comments, save comments, report them, reply to them, view a summary of voting data, and a few other things. On top of this all of my data is updated in real time from my server through pubnub. This is why I say that ~40 watches per comment is about the minimum I can make it to support all the features I want for my users.
Even if I were able to bring that number much lower (say ~10) I don't think that would solve my problem becuase even then loading a thread of 120 comments which is long but not impossible would have the same slowness of 1200 watches as my example above.
While I might be able to further optimize my application I am still interested in how I might work through the situation of loading an arbitrarily long set of widgets with ng-repeat. Is my solution above of writing a directive to only compile those that are in the user's viewport a good idea?