Features in a feature layer are fetched using the query function on a feature service, which is documented here: ArcGIS REST API
The controller is in charge of determining when to send those queries, besides the first query, which is sent before the controller is instantiated. The controller watches its extent property and the layer's definition expression for changes, and it sends a new query when a change occurs. This is why changing the extent property on the controller or changing the definition expression causes new features to be fetched.
If you need to set this process up for all feature layers, you might try something like this:
view.watch('stationary', isStationary => {
if (isStationary){
view.layerViews.forEach(lv => {
if (lv.layer.type === 'feature'){
lv.controller.extent = view.extent);
}
})
}
});
I think that will catch group layers.
In general, there's one layerView for each layer. The layer itself represents the reference to some back-end resource (or sometimes a front-end resource) while the layerView contains logic and information about how the layer is actually displayed in the view.