The problem you are having is that angular can´t get a hold to the reference of a primitive (it´s just not possible in javascript neither in java as far as I know) and that is why, on the second row of the table of your example the 'watch' works, because you are doing the binding to a position in the array which does has a reference .
<input type="text" ng-model="complex.two[$index]" />
and not to the primitive itself.
From here on I´m just guessing because I don´t really know how angular does the binding.
on the second row, every time you type a character on a column's input angular realizes you are changing the array and overwrittes that possition of the array with the new input value. That´s why the watch works but unfortunately as a result of changing the items of the array, angular redraws the row resulting on you loosing your focus.
Hope this could help you.
Carles