Никак, но должна быть своеобразная этика этого дела. Ситуация ничем не отличается от OCModа или других обработчиков событий - и там и там можно заменить все и наломать всем остальным модулям, которые вмешиваются в это место.
Согласен, это достаточно странно, но в принципе ничего сложного:
if (!$code) $code = file_get_contents(DIR_TEMPLATE . $this->registry->get('config')->get('template_directory') . $route . '.twig');
В базовом варианте да. А так - можно использовать достаточно сложную логику, недостижимую в OCMod/vQmod, что однозначно плюс.
Для шаблонов - принципиально ничем не отличается, кроме усложненной отладки. Но хоть какой-то вариант лучше, чем никакого.
С кешем, кстати, все нормально - при первом обращении к конкретному .twig результат записывается в PHP-файл кеша, как обычно. Правда, я не разбирался, зависит ли имя файла от содержимого $code, или только от названия шаблона. Но, похоже, что не зависит.
Меня в этой всей истории смущает другое. Мне кажется, что отличительной особенностью Opencart по сравнению с Wordpress/Prestashop/Magento было то, что можно было просто читать и менять код движка, быстро добиваясь нужного результата. Низкий порог входа, прямолинейное изменение и все такое. А с переходом на события становится "как у всех", когда для даже небольшой модификации надо сильно много думать и курить кучу доков.