The default block template used for menu blocks includes some accessibility enhancements so that the menu is semantically treated as a navigation landmark for screen readers and is labeled appropriately based on the title of the block:
{% set heading_id = attributes.id ~ '-menu'|clean_id %}
<nav role="navigation" aria-labelledby="{{ heading_id }}"{{ attributes|without('role', 'aria-labelledby') }}>
{# Label. If not displayed, we still provide it for screen readers. #}
{% if not configuration.label_display %}
{% set title_attributes = title_attributes.addClass('visually-hidden') %}
{% endif %}
{{ title_prefix }}
<h2{{ title_attributes.setAttribute('id', heading_id) }}>{{ configuration.label }}</h2>
{{ title_suffix }}
{# Menu. #}
{% block content %}
{{ content }}
{% endblock %}
</nav>
The labeling part is sort of broken when the block is placed using Layout Builder and will cause issues if there's more than one menu output on the page. This is because the label of the block is assigned to the navigation landmark using an HTML ID, but the HTML ID is not set by Layout Builder. If instead the block is output using the block placement UI, the ID is set thanks to BlockViewBuilder.
So for Layout Builder, the template will include markup like this:
<nav role="navigation" aria-labelledby="-menu" data-block-plugin-id="menu_block:ps-utility-menu" class="block block-menu navigation menu--ps-utility-menu">
<h2 id="-menu">Utility menu</h2>
...
</nav>
The ID is not unique anymore. Any additional menu blocks on the page will have the same "-menu" ID and screen readers won't handle this well.
I don't think layout builder should assign an ID attribute for every block, but it seems like in the case of menu blocks it needs to, since the menu block template assumes it is set.