JSFiddle - React, Tailwind, and code Playground

HTML

<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.10/angular-route.js"></script>
<div ng-app="testApp">
  <div ng-controller="Ctrl">
    <p>Select item 1, then change first level. -> Change is applied.</p>
    <p>Reload page.</p>
    <p>Select item 1, then change second level. -> Change is now applied correctly.</p>
    <select ng-model="selectedOption" ng-options="(selectedOption.id + ' - ' + selectedOption.name) for selectedOption in myCollection track by selectedOption.id">
    </select>
    <button ng-click="changeFirstLevel()">Change first level</button>
    <button ng-click="changeSecondLevel()">Change second level</button>
    <p>Collection: {{ myCollection }}</p>
    <p>Selected: {{ selectedOption }}</p>
  </div>
</div>

JavaScript

var testApp = angular.module('testApp', []);

testApp.controller('Ctrl', ['$scope', '$timeout', function($scope, $timeout) {
  
  $scope.myCollection = [{
    id: '1',
    name: 'name1',
    nested: {
      value: 'nested1'
    }
  }];

  $scope.changeFirstLevel = function() {
    var newElem = {
      id: '1',
      name: 'newName1',
      nested: {
        value: 'newNested1'
      }
    };
    $scope.myCollection[0] = newElem;
  };

  $scope.changeSecondLevel = function() {

    // Stores value for currently selected index.
    var currentlySelected = -1;
    
    // get the currently selected index - provided something is selected.
    if ($scope.selectedOption) {
      $scope.myCollection.some(function(obj, i) {
          return obj.id === $scope.selectedOption.id ? currentlySelected = i : false;
      });
    }

		var newElem = {
      id: '1',
      name: 'name1',
      nested: {
        value: 'newNested1'
      }
    };
    $scope.myCollection[0] = newElem;

    var temp = $scope.myCollection; // store reference
    
    $scope.myCollection = []; // change the collection in this digest cycle so ngOptions can detect the change
    
    $timeout(function() {
      $scope.myCollection = temp;
      // re-select the old selection if it was present
	    if (currentlySelected !== -1) $scope.selectedOption = $scope.myCollection[currentlySelected];
    }, 0);
  };

}]);