Q:

initial ng-model values not setting select correctly

Given the following angular component, with a working plunker.
export const AppComponent = {
  template: 'see below'
  controller: class AppComponent {
    static $inject = ["$http"];
    constructor(public $http) {
    }
    $onInit() {
      this.$http.get("types.json").then(_ => this.types = _.data);
      this.$http.get("docs.json").then(_ => this.documents = _.data);
    }
  }
};

With template
<div>
    <h3>Types</h3>
    <div ng-repeat='document in $ctrl.types'>{{document.name}}</div>

    <h3>Docs</h3>
    <div ng-repeat="status in $ctrl.documents">
        <span ng-bind="status.documentType.name"></span>
        <ul ng-repeat="document in status.correspondence">
            <li>{{document.name}}</li>
            <li>
                {{document.documentTypeId}}
                <!-- ng options: can't seem to get correct mapping for just the `ID`,  
                     it always binds the while type object.
                     ng-options="type.name for type in $ctrl.types track by type.id"
                -->
                <select
                    ng-model="document.documentTypeId">
                    <option ng-repeat="type in $ctrl.types" value="{{type.id}}">{{type.name}}</option>
                </select>
            </li>
        </ul>
    </div>
</div>

The inital values for the select are not set, but when the values are changed by clicking a particular type, the model is updated correctly.

why are the select values not being set correctly from the model when the page loads?

A:

ngOptions supports custom child property to become ngModel for the dropdown. Like this,
ng-options="type.id as type.name for type in $ctrl.types"
            ^^^^^^^^^^

which can be read as value as label for collection. But, this can't be used along with track by. You have to pick one or other.
And, in this case, we could get rid of track by since we don't have too complex objects to iterate over.
working example

