Il punto è questo: è vero, i vari CanExecute vengono invocati molte volte. Ma il dispatcher di WPF è progettato in modo così intelligente che il thread UI non risente minimamente del lavoro svolto dietro le scene, per questo non te ne accorgi neanche.
Generalmente CommandManager.InvalidateRequerySuggest serve a "sporcare" il sistema di commanding affinchè lo stesso verifichi nuovamente l'eseguibilità dei comandi, che vuol dire, in altre parole, che tutti i CanExecute vengano invocati di nuovo. Non so dirti come mai il tuo pulsante non si riabiliti, bisognerebbe vedere il codice di CanExecute, come viene fatto il binding... tutto il contesto insomma, mentre posso dirti che quel codice che stai usando non fa altro che duplicare un lavoro che WPF fa già per te.
Alessandro Del Sole (WPF T&T Team)
Microsoft MVP - Visual Basic: Development
http://community.visual-basic.it/Alessandro