Модель является доменом вашего приложения и поэтому содержит логику вашего домена, такую как бизнес-правила и проверки. ViewModel - это модель для вашего представления. Он обрабатывает взаимодействия между пользователем и представлением, то есть когда пользователь нажимает кнопку, модель представления будет обрабатывать это взаимодействие и может вносить или не вносить изменения в модель. Обычно на языке OO вы хотите, чтобы ваши объекты имели только одну ответственность.
В WPF ViewModel обычно реализует интерфейс INotifyPropertyChange, который затем просматривается представлением для любых изменений. Вы не хотели бы, чтобы модель реализовала этот интерфейс, так как он в любом случае не связан с вашим доменом.
Еще одна причина разделения заключается в том, что иногда в вашем представлении не обязательно отображать все данные, содержащиеся в модели. Например, если ваша модель предоставляет 15 свойств, но в одном из ваших представлений пользователь должен видеть только 5 из этих свойств. Если вы поместите вашу модель в ViewModel, представление будет доступно для всех 15 свойств, тогда как если вы инкапсулируете модель в ViewModel, тогда только эти 5 свойств будут доступны представлению.
Возможно, есть еще много причин, но в целом это хороший принцип проектирования, чтобы разделить их. С учетом вышесказанного, если ваше приложение достаточно маленькое, вы можете избежать необходимости иметь вместе вашу модель и ViewModel, чтобы уменьшить избыточность в вашем коде.