В статье по сути все правильно, это не бесконечный цикл, да в нем сравниваются старое и текущее значение, в случае отличия вызывается "callbacks".
$digest() вызывается на каждом углу и на каждый чих: после $timout, после $http, после ng-click и пр. поэтому создается иллюзия "отслеживание изменений в реальном времени".
И если ng директив много это же очень затратно?
На современном железе и браузере может происходить более 10M сравнений в секунду, поэтому приложения с небольшим $digest с небольшим кол-м ватчей 1000-20к работает быстро (зависит от ватчей).
Так же сейчас во всех фреймворках идет тенденция в сторону (изолированных) компонентов, поэтому при правильном построении веб приложения (1000 компонент х 1000 ватчей) -> и 1М ватчей будет работать быстро (1мс).