השתמשתי בפונקצית האזנה $watch באנגולר
ואז קראתי שהיא יקרה מאוד בביצועים
וגם הפריע לי שאני לא יכול לשלוט על סדר המשימות
אז החלטתי להחליף את האזנה בפונקציה משלי, כלומר שעדכון המשתנה יהיה באמצעות פונקציה set שכתבתי.
אבל לא מצאתי פתרון לצורך להאזין לשינוים שיכנסו למשתנה model באמצעות שינוי האינפוט - עם לקבל את הערך הישן והחדש.
עד ש @dovid מצא את הפתרון המבריק הזה
<select ng-change="updateValue(user, '{{user.id}}')"
ng-model="user.id" ng-options="user.id as user.name for user in users">
</select>
מה שבתוך {{}} נותן את הערך הישן, כיון שלפני שאנגולר מריץ את הקוד הוא ממיר את כל ה-{{}}.