Workflows that include sending an e-mail will get stuck in Waiting because the recipient either does not have an e-mail address or they have Do no allow E-mails set to Do Not Allow. This can potential cause system performance issues as the number of waiting e-mails grows with each failed attempt.
To prevent this from happening, you simply need to add a Check Condition to your workflows prior to the Send E-mail step. This check condition will look at the contact or account that the system will be sending the e-mail and check to make sure these two conditions are met.
As you can see, if the contact (or account) meets the conditions, the e-mail is sent. If not, the workflow is canceled. This ensures that the system job (workflow) is set to a completed state and is no longer consuming resources.
Below are the details for the Check Condition referenced in the workflow.
For more examples of best practices, please read the Workflow Authoring Best Practices blog post from the Microsoft Dynamics CRM team.