Em termos mais simples, gosto de pensar no seguinte:
Modelo: estritamente parece e se parece com seu modelo de dados. Para todos os efeitos, é apenas uma representação de classe de seu modelo de dados. Ele não tem conhecimento de sua Visualização ou de quaisquer elementos em sua Visualização. Dito isso, ele não deve conter nenhum decorador de atributo (ou seja, necessário, comprimento, etc.) que você usaria para sua visualização.
View Model: Serve como um aglutinante de dados entre sua View e seu Model e, em muitos casos, também é um wrapper para seu Model. Ele seria tornado inútil sem o View, portanto, normalmente não é reutilizável em vários Views e Controllers como um Model padrão é.
Por exemplo, seu modelo pode ter as seguintes propriedades, que são representações diretas de sua fonte de dados:
public string FirstName { get; set; }
public string LastName { get; set; }
Agora, como seu modelo de visualização está vinculado à sua visualização, ele pode ter a seguinte propriedade - que concatena os campos FirstName e LastName do modelo juntos como uma string:
[Display(Name = "Customer Name")]
public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}