Wildcards are ignored in some smart group criteria, when the smart group is directly generated for a mailing
If you create an Advanced Search with a wildcard in a custom data field*, then use the Actions menu to create a Mailing from these search results, the Mailing won't apply the wildcard. This usually results in fewer recipients than in the original search.
But if you create a smart group from the data, and then use the smart group in a new mailing, everything works fine.
Ultimately this happens because of this line in CRM_Contact_BAO_SavedSearch, which is actively stripping out % wildcards from the values in the database: https://github.com/civicrm/civicrm-core/blob/master/CRM/Contact/BAO/SavedSearch.php#L164
Why is there a difference between the two types of smart group? When you save a smart group directly, you're sent via CRM_Contact_Form_Task_SaveSearch. This serializes the advanced-search form values as query format (? not sure of terminology, sorry). But if you want to create a mailing directly you go via CRM_Mailing_Form_Task_AdhocMailing. This serializes the advanced-search form values directly from quickform.
When these values are unserialized in CRM_Contact_Form_Task_SaveSearch::getFormValues(), the query format ones are fine as-is. But the form values need some processing, and that's when the % is stripped out.
This is a bit low-level for me to start messing around with, so I'm going to Paid Issue Queue this one.
*I haven't tested if this applies to other fields too