Почитайте:
https://github.com/angular/angular.js/wiki/Underst...
tl/dr
Это связано с реализацией наследования скоупов в angularjs. Наследование организуется через прототипы объектов, а в этом случае наследуются только ссылки. В вашем случает ng-model записывает результат в свой скоуп и из родительского скоупа мы не можем его прочитать.
Как правило директивы создают свои скоупы (но не всегда), в том числе и ng-model. Потому этот момент стоит учитывать.
Самым простым решением, которое не будет выглядеть как кастыль, является controllerAs синтаксис который появился в angular 1.2. То есть ваш контроллер будет выглядеть так:
function MyController() {
var vm = this;
this.textBoxValue = 'test';
}
<div ng-controller="MyController as myCtrl">
<input type="text" ng-model="myCtrl.textBoxValue" />
</div>
вы сразу же получаете дополнительные бонусы в виде разделения пространства имен контроллеров. Ну и по сути хорошим правилом будет не использовать $scope вообще. Единственное место где его можно использовать - link директивы и это относительно редкий случай.
Ну и почитайте про компонентный подход построения приложений для ангуляра. В частности: никаких независимых контроллеров, все разбивается чисто на директивы (в том число и все приложение будет одной большой директивой-компонентом).