MVVM에 대한 개념이 약간 다른듯 해서 제가 아는 걸 요약해 볼게요.
ViewModel: 뷰의 상태를 보관하는 View state hodler로 Model로 부터 데이터를 가져와 View에 전단하는 중계역할.
Model: 어플리케이션에 필요한 데이터 처리를 담당, API, 비지니스로직에 여기에 속함.
데이터의 보관은 프로젝트의 상황에 따라
ViewModel에 할 수도 있고 모델 단에 메모리나 DB에 보관할 수도 있고, 필요하다면 Retrofit의 캐시를 사용할 수도 있습니다. 이건 순전히 프로젝트의 상황을 봐서 결정할 문제이구요, 특히 님이 유지보수하기에 적합한 방법이어야 합니다.
안드로이에 종속적이지 않는 MVVM을 사용할 계획이면 ViewModel클래스와 LiveData는 사용을 피하셔야 합니다. 이 클래스들은 안드로이드 SDK의 일부입니다. Kotlin을 사용하신 다면 LiveData대신 Flow가 좋은 대안인데, 문제는 안드로이드 ViewModel없이 많은 추가코드를 작성해야 할 수도 있습니다.
LiveData를 사용하시면 다면 뷰는 LiveData를 observe만 하면 되고, 데이터의 변경은 ViewModel에서 LiveData를 통해 하면 뷰쪽으로 데이터가 전달됩니다.
네비게이션은 View의 역할입니다. 다만 여기에 필요한 데이터는 ViewModel을 통해서 가져오는 경우가 많습니다. ViewModel에 갈 필요가 없다면 그냥 뷰에서 처리하셔도 되겠죠.
View에 인터페이스를 구현하고 ViewModel에 해당 인터페이스를 전달해서 ViewModel에서 인터페이스를 직접 호출하는 방식은, MVP라고 하는 패턴과 아주 유사합니다. 그렇게 해도 안되는 건 아닌지만, 이렇게 되면 뷰와 뷰모델의 통신방법이 두가지가 존재하게 되는 거라 코드 측면에서 추후에 헷갈리기 쉽고, LiveData를 굳이 사용할 필요가 없게 됩니다. 안드로이드 ViewModel를 사용할 필요없이 그냥 일반 클래스를 사용하는게 나을 수도 있구요. 왜 안드로이드 ViewModel과 LiveData가 도입되었는지 이해할 필요가 있습니다. (주된 이유는 라이프사이클 처리)
뷰모델이 뷰에 대한 정보를 갖고 있지 말라는 이유는, 님이 말하는 이유 외에 좀 더 안드로이적으로 말하면,ViewModel은 Activity, Fragment보다 라이프사이클이 깁니다. 따라서 뷰에 대한 참조를 ViewModel이 가지고 있으면, 어느 시점에서 View 에 대한 참조는 null이 될 수 있습니다. 주의를 하지 않으면 문제가 생길 소지가 있기 때문에, 문제의 원인은 애초에 없애는게 바람직합니다. 인터페이스를 쓴다고 해도, 인터페이스의 구현체는 어차피 뷰일 때니 결과적으로는 마찬가지입니다. 다만 테스트를 좀 더 쉽게할 수있도록 하는 이점은 있을 겁니다.
뷰에서만 필요한 이벤트 처리는 뷰에서만 하시면 되고 ViewModel로 넘길 필요가 없습니다. 하지만 스크롤 이벤트가 발생했을 때 ViewModel에 있는 데이터를 변경해야 한다면 ViewModel에서 처리를 해야 겠죠. 하지만 DataBinding을 사용하는 것이 아니라면, View.OnClick이벤트 등을 ViewModel에 직접 만드는 것 보다는 뷰 쪽에 해당 리스너를 만들고 그 안에서 ViewModel을 호출하는 것이 좋습니다. ViewModel에 가능하면 Android 관련 참조가 없어야 테스트 등이 용이합니다.