It's not the observer pattern. With the observer pattern, the observed object explicitely notifies its observers when it changes.
The AngularJS watch mechanism compares the result of the evaluation of the expression before and after an event has been handled, and if the value of the expression has changed, it notifies the watchers. If the watcher execution causes the expression value to be changed again, the watcher is called again, etc. etc. until a limit of 10 cycles has been reached.
This is explained in the $scope documentation.