Yup, nodes and objects are not the same. The object is the collection of attributes, and the node is a placement in the tree. They usually have different IDs. You can see the object id for instance in the edit link.
in menu.tpl as called by node_view gui
$node.id = ID from above
{let children_count=fetch('content',list_count,hash(parent_node_id,$node.id))} if node_id count > 0 else count == 0
When you use fetch('content', object, hash(object_id,xx)) then xx MUST be an object id.
When you use node_view_gui, you MUST supply a node. $menuitem is a content object in this case. This should work: {node_view_gui view=menu content_node=$menuitem.main_node ...
fetch('content',list_count,hash(parent_node_id,$node.id)) $node.id will not work. Use $node_id or $node.node_id, depending on your template code.