Частично победил.
Оказалось, что стандартный модуль меню в принципе не умеет показывать сложные меню. Это у него в крови

Чтобы научить его новым танцам - нужен бубен
Нужно подправить два файла:1) <site>\administrator\modules\mod_menu\helper.php - меняем функцию getComponents() на это
/**
* Get a list of the authorised, non-special components to display in the components menu.
*
* @param boolean $authCheck An optional switch to turn off the auth check (to support custom layouts 'grey out' behaviour).
*
* @return array A nest array of component objects and submenus
* @since 1.6
*/
public static function getComponents($authCheck = true)
{
// Initialise variables.
$lang = JFactory::getLanguage();
$user = JFactory::getUser();
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$result = array();
$langs = array();
// Prepare the query.
$query->select('m.id, m.title, m.alias, m.link, m.level, m.parent_id, m.img, e.element');
$query->from('#__menu AS m');
// Filter on the enabled states.
$query->leftJoin('#__extensions AS e ON m.component_id = e.extension_id');
$query->where('m.client_id = 1');
$query->where('e.enabled = 1');
$query->where('m.id > 1');
// Order by lft.
$query->order('m.level, m.lft');
$db->setQuery($query);
// component list
$components = $db->loadObjectList();
// Parse the list of extensions.
foreach ($components as &$component) {
// Trim the menu link.
$component->link = trim($component->link);
if ($component->parent_id == 1) {
// Only add this top level if it is authorised and enabled.
if ($authCheck == false || ($authCheck && $user->authorise('core.manage', $component->element))) {
// Root level.
$result[$component->id] = $component;
if (!isset($result[$component->id]->submenu)) {
$result[$component->id]->submenu = array();
}
// If the root menu link is empty, add it in.
if (empty($component->link)) {
$component->link = 'index.php?option='.$component->element;
}
if (!empty($component->element)) {
// Load the core file then
// Load extension-local file.
$lang->load($component->element.'.sys', JPATH_BASE, null, false, false)
|| $lang->load($component->element.'.sys', JPATH_ADMINISTRATOR.'/components/'.$component->element, null, false, false)
|| $lang->load($component->element.'.sys', JPATH_BASE, $lang->getDefault(), false, false)
|| $lang->load($component->element.'.sys', JPATH_ADMINISTRATOR.'/components/'.$component->element, $lang->getDefault(), false, false);
}
$component->text = $lang->hasKey($component->title)? JText::_($component->title) : $component->alias;
}
} else {
if($component->parent_id ==1233){
}
if($component->level == 3){
// Sub-menu level.
if (isset($result[$parent_id])) {
if (!isset($result[$parent_id]->submenu[$component->parent_id]->submenu)) {
$result[$parent_id]->submenu[$component->parent_id]->submenu = array();
}
// Add the submenu link if it is defined.
if (isset($result[$parent_id]->submenu[$component->parent_id]->submenu) && !empty($component->link)) {
$component->text = $lang->hasKey($component->title)? JText::_($component->title) : $component->alias;
$result[$parent_id]->submenu[$component->parent_id]->submenu[$component->id] = &$component;
}
}
}
else{
// Sub-menu level.
$parent_id = $component->parent_id;
if (isset($result[$parent_id])) {
// Add the submenu link if it is defined.
if (isset($result[$parent_id]->submenu) && !empty($component->link)) {
$component->text = $lang->hasKey($component->title)? JText::_($component->title) : $component->alias;
$result[$parent_id]->submenu[$component->id] = &$component;
}
}
}
}
}
$result = JArrayHelper::sortObjects($result, 'text', 1, true, $lang->getLocale());
return $result;
}
2) и в файле: <site>\administrator\modules\mod_menu\tmpl\default_enabled.phpМеняем строку №290
$menu->addChild(new JMenuNode($sub->text, $sub->link, $sub->img));
на такой код
if (!empty($sub->submenu))
{
// This element has a submenu.
$menu->addChild(new JMenuNode($sub->text, $sub->link, $sub->img), true);
foreach ($sub->submenu as $s)
{
$menu->addChild(new JMenuNode($s->text, $s->link, $s->img));
}
$menu->getParent();
}
else
{
$menu->addChild(new JMenuNode($sub->text, $sub->link, $sub->img));
}
Правда, так пункты меню 4-го уровня отображаются одновременно с 3-м, даже если не выбран родительский элемент, но это уже пол беды.
Впрочем, если кто-то предложит более элегантное решение - приму его с удовольствием.