Не предполагайте, что CanExecute будет вызван с помощью функции Execute. Интерфейс для ICommand не подразумевает, что он вызывает CanExecute при вызове Execute, поэтому, если для вас важно, чтобы он выполнялся только тогда, когда CanExecute является истинным, просто проверьте его самостоятельно.
Кроме того, сканирование декомпилированного кода для RoutedUICommand, я не вижу нигде, который проверяет CanExecute внутри Execute.
На самом деле ответственность покупателя заключается в том, чтобы определить, когда вызывать Execute/CanExecute.