The reason recomposition still happens is due to performance optimizations mentioned in the blog post. If you instead dispose the composition when the view goes off screen, that is worst for performance.
In terms of accessing a viewmodel, my recommendation is to only pass the state that the composable needs rather than the whole VM (VMs should only be passed at the screen-level composable). That follows our architecture best practices and protects you from edge cases like this