Во-первых, прочитайте столько, сколько сможете на MVVM, например, Приложения WPF с шаблоном проектирования Model-View-ViewModel в MSDN. Когда вы поймете основные принципы, лежащие в его основе, ответ будет более разумным.
По сути, вы хотите, чтобы ваши слои View (UI) и ViewModel (по существу абстрактный UI, но также и абстрактная модель) отделялись и были развязаны. Отображение окна сообщения или закрытие окна должно рассматриваться как деталь, специфичная для пользовательского интерфейса, и, следовательно, реализовано в представлении или, в случае окна сообщения, более общедоступным через «Сервис».
Что касается ViewModel, это достигается с помощью Инверсия управления (IoC). Возьмите пример окна сообщения выше. Вместо того, чтобы показывать само окно сообщения, оно берет зависимость от IMessageBoxService, у которого есть метод Show, а ViewModel вызывает это вместо этого - делегируя ответственность. Этого можно добиться, используя контейнеры Dependency Injection (DI).
Другой подход, используемый для закрытия окна View, может состоять в том, чтобы ViewModel представлял событие, называемое, например, RequestClose (как в статье MSDN), на которое подписывается View. Затем ViewModel вызовет событие, когда захочет закрыть соответствующий вид / окно; он предполагает, что что-то еще слушает, и возьмет на себя ответственность и фактически сделает это.