Нашел проблему! Родительский контроллер представления в моем приложении прослушивает жесты встряхивания, что требует, чтобы контроллер представления, прослушивающий встряски, становился первым респондентом. Контроллер родительского представления должен вызвать
[self resignFirstResponder];
перед отображением MFMailComposeViewController. После добавления этой строки MFMailComposeViewController работал как шарм.
Как правило, любые контроллеры представления, прослушивающие жесты встряхивания, должны подать в отставку первого респондента, прежде чем показывать любые другие контроллеры представления. В противном случае приложение будет продолжать реагировать на жесты дрожания, даже если соответствующий контроллер представления не виден, что, безусловно, может привести к еще более серьезным проблемам, чем MFMailComposeViewController, отображаемый в странном режиме только для чтения.