Set default screen option for appearance -> menus

This option is stored in the wp_usermeta table with the meta_key name of metaboxhidden_nav-menus.

If we hide all the boxes, this is the meta_value of the option:

array(
    "nav-menu-theme-locations", 
    "add-custom-links", 
    "add-post", 
    "add-page", 
    "add-portfolio", 
    "add-category", 
    "add-post_tag", 
    "add-post_format", 
    "add-location"
)

There is one CPT, portfolio. If we wanted for it to be always visible every time the user visits the page (/wp-admin/nav-menus.php), this code would do that:

add_filter( 'get_user_option_metaboxhidden_nav-menus', 'cpt_always_visible_wpse_87882', 10, 3 );

function cpt_always_visible_wpse_87882( $result, $option, $user )
{ 
    if( in_array( 'add-portfolio', $result ) )
        $result = array_diff( $result, array( 'add-portfolio' ) );

    //$show_boxes = array( 'cpt1', 'cpt2', 'cpt3' );
    //if( in_array( $show_boxes, $result ) )
    //  $result = array_diff( $result, $show_boxes );

    return $result;
}

But this forces the CPT to be visible even if the user un-checks the Screen Option. In the next visit to the page, the box will be visible again.

To do it one time after user registration, the action hook user_register should be used together with the function update_user_meta.

To do it on a fresh install, a custom install.php could be used. Maybe another technique is available, but not sure about it…