Trigger ngOnChanges for Array or Object
The solution turned out to be pretty simple, copy the contents into a new array or object with the javascript spread operator (...). This creates a new reference which triggers Angular change detection to call ngOnChanges().
Here's how to copy an Angular property of type array or object with the spread operator:
// copy array prop to trigger change detection
this.myArr = [...this.myArr];
// copy object prop to trigger change detection
this.myObj = {...this.myObj};