I've been working with MVVM since 2008 and your explanation is mostly as I would explain it to someone who has not worked with MVVM or any MV* pattern before.
As Michael said the core thing is to separate the view from the logic as all MV* frameworks aim for but there are slight differences in how this can be achieved. With WPF came XAML which took databinding to a whole new level, now we could bind almost anything without a direct dependency to the data.
In MVC we have the controller which "tells" the view what to do and in MVVM the view listens to what the ViewModel has to say eg. the IsDirty property of the ViewModel indicates that the data has changed then the view has a way of visualizing this. It's not the ViewModels job of telling the view what to do, its the view that listens to changes in the ViewModel. This works the other way around by binding two way for input controls. The ViewModel does not know how this data came to be, it only dictates what type it should be.
When I try to explain more complex projects written in MVVM i divide ViewModels into two different sub types; WrapperViewModels, LogicViewModels.
WrapperViewModel: This is a ViewModel that is more or less just makeup on a Model. It contains properties that exposes the data together with PropertyChanged logic. It contains logic for exposing eg. FullName when the model only has FirstName and LastName etc. This VM can however be replaced by implementing INotifyPropertyChanged in the model, but it might not be the best approach in all cases.
LogicViewModel: These VM are the ones that contains the application logic. The MainViewModel which is the heart of the application is one example of these. If you see the application as a set of islands where each island is responsible for a part of the application this part usally has its own LogicViewModel
When it comes to the Model layer i usally say that the following logic resides in that layer; Data, DatabaseAccess, ServiceAccess, FileAccess. Essentially all code that has to do with stuff outside the application coming in or going out. I would not write any logic in the ViewModels that directly access anything other than Model objects and other ViewModels.
There are cases when MVVM tend to make some easy tasks overly complex. In these scenarios I would suggest looking into making a real control out of a view and viewmodel. Doing this makes it possible to reuse the control and have full control of the internals of it. Other things that simplifies MVVM development and are almost mandatory is the knowledge of the messenger/mediator pattern, Dependency Injection and Behaviors/Triggers/Actions/Attached Properties.
A thing that most people say is that the View should be pure Xaml, no logic what so ever. This is completely wrong in my opinion. Code/logic is allowed in the View as long as you follow the principle that the View should not know about the ViewModel logic. As log as the logic is purely for leveraging presentation it is OK but as soon as you have a reference to a ViewModel class you are on thin ice.