Il controller e il ViewModel differiscono in vari modi.
In MVC il controller conosce la vista, può cambiare la vista. Conosce anche il modello e può chiamarlo. In MVVM un ViewModel è una rappresentazione astratta della vista e non conosce l'interfaccia utente concreta, avvolge il modello in modo da poterlo visualizzare come desiderato.
Nel MVC classico, un controller è solo una strategia della vista per interagire con il modello. In effetti, a volte un controller non è nemmeno necessario. In MVVM non è necessario, poiché è possibile avere diversi ViewModel per la stessa vista se sono necessari comportamenti diversi. In MVC potresti avere ad esempio un ReadOnlyController o un AdminController per comunicare con il modello. In MVVM potresti avere solo due ViewModel e scegliere quello che ti serve per la View.
Ma hanno alcune somiglianze. In entrambi i modelli, la vista è un osservatore . Nel MVC classico, la vista è un osservatore del modello, in MVVM è un osservatore del ViewModel.
Entrambi i modelli hanno lo scopo di fornire una separazione delle preoccupazioni. MVVM mira principalmente a fornire un'astrazione della vista, completamente indipendente dalla tecnologia dell'interfaccia utente in uso. MVC non va così lontano. L'obiettivo principale è la separazione delle preoccupazioni, in modo da non mettere in risalto la logica aziendale (il Modello).
Potresti anche trovare utile questa mia risposta a una domanda simile.
Alla fine, dovrei dire che entrambi i modelli appartengono alla stessa famiglia. MVP, di cui MVVM è un discendente è un fratello di MVC. Se vuoi saperne di più segui questo link al sito Web di Martin Fowler , spiega tutto in dettaglio.