El controlador y el ViewModel difieren de varias maneras.
En MVC, el controlador conoce la vista, puede cambiar la vista. También conoce el modelo y puede llamarlo. En MVVM, un ViewModel es una representación abstracta de la Vista y no conoce la interfaz de usuario concreta, envuelve el Modelo de manera que se pueda mostrar como se desee.
En MVC clásico, un controlador es solo una estrategia de la Vista para interactuar con el Modelo. De hecho, a veces ni siquiera es necesario un controlador. En MVVM no lo necesita, ya que puede tener diferentes ViewModels para la misma Vista si necesita diferentes comportamientos. En MVC podría tener, por ejemplo, un ReadOnlyController o un AdminController para comunicarse con el Modelo. En MVVM, podría tener dos ViewModels y elegir el que necesita para la Vista.
Pero tienen algunas similitudes. En ambos patrones, la Vista es un observador . En MVC clásico, la vista es un observador del modelo, en MVVM es un observador del ViewModel.
Ambos patrones están destinados a proporcionar una separación de preocupaciones. MVVM tiene como objetivo principal proporcionar una abstracción de la Vista, completamente independiente de la tecnología UI en uso. MVC no llega tan lejos. Su enfoque principal es la separación de las preocupaciones, para que no ponga la lógica de negocios (el Modelo) en la vista.
También puede encontrar útil esta respuesta mía a una pregunta similar.
Por último, debería decir que ambos patrones pertenecen a la misma familia. MVP, del cual MVVM es descendiente, es un hermano de MVC. Si quieres saber más, sigue este enlace al sitio web de Martin Fowler , explica todo en detalle.