How to remove admin main menu name repetition

You can remove it from the submenu array:

function add_my_menu(){
    global $submenu;
    add_menu_page( 'Main Menu', 'Main Menu', 'manage_options', 'main-menu-settings', 'main_menu_settings');
    add_submenu_page( 'main-menu-settings', 'Sub Menu', 'sub menu', 'manage_options', 'sub-menu', 'sub_menu_settings');
    unset( $submenu['main-menu-settings'][0] );
}

The parent item is added by add_submenu_page in plugin.php as the first link if the parent doesn’t already have a submenu, resulting in:

[main-menu-settings] => Array
    (
        [0] => Array
            (
                [0] => Main Menu
                [1] => manage_options
                [2] => main-menu-settings
                [3] => Main Menu
                [4] => menu-top menu-icon-generic toplevel_page_main-menu-settings
                [5] => toplevel_page_main-menu-settings
                [6] => dashicons-admin-generic
            )
        [1] => Array
            (
                [0] => sub menu
                [1] => manage_options
                [2] => sub-menu
                [3] => Sub Menu
            )
    )

being added to $submenu.

I assume that UI decision is along the lines of Don’t Make Me Think. All the menu links are grouped in the same place so the user doesn’t have to remember to click the parent link in the sidebar to go to the main page for that section. So the primary purpose of that parent link in the sidebar is to open the submenu.

If the user is hovering over the submenu trying to determine which page to go to, and the main page is not listed, they might not think to click on the parent link in the sidebar.

Since every other WordPress menu works that way, consider leaving it as is.

Another option is to make it more descriptive.

global $submenu;
$submenu['main-menu-settings'][0][0] = "My Plugin Main Menu";