Потому что сокет работает асинхронно, и angular не знает об изменении переменной. Для того чтобы angular проверил эту переменную, тебе нужно заставить его это сделать, для этого ты можешь либо вызвать функцию $scope.$apply() или $scope.$digest() или обернуть код который изменяет данные в конструкцию
$timeout(function(){
// тут код
})
Но с использованием функций $scope.$apply() и $scope.$digest() есть одна проблема, если digest уже запущен, angular падает, поэтому я советую тебе использовать $timeout