ViewModels are entities where, when you update the model, your view will get updated automatically and vice versa. In many online articles and even in some books, the authors refer to ViewModels when they actually mean Models specific to the View.
In ViewModels, binding is two-way: when you update either the model or the view, the other one will get updated automatically.
In models specific to the view, we are binding in only one way, from the model to the view. Here, we are sending a model specific to the view instead of the generic model (which represents a business domain class).
However, in this course, we will be referring to models specific to a view as ViewModels for brevity. Unless otherwise specified, you should read all ViewModels as models specific to a view. So, I am making the same mistake made by other authors (which I don't intend to do).
Using ViewModels is entirely optional.
There are few drawbacks of using ViewModels. First, you have to create a new class for your ViewModel. Second, you need to write code that translates from ViewModel to view and vice versa. There are frameworks to automate this process, such as AutoMapper.
ViewModels is good practice wherever it makes sense since it reduces the coupling.