remove/hide pages from users backend

One way to achieve this is by looping through the parent pages and fetching their respective children pages ids.

The resulting arrays can then be merged and used in the 'post__not_in' variable.

add_filter( 'parse_query' , 'exclude_pages_from_admin' );

function exclude_pages_from_admin( $query ) {

    global $pagenow,$post_type;
    $pages   = array('1','2','3');
    foreach ( $pages as $parent_page ) {
        $args = array(
            'post_type' => 'page',
            'post_parent' => $parent_page,
            'fields' => 'ids',
        );
        $children = new WP_Query( $args );
        $pages = array_merge( $pages, $children );
    }
    if ( is_admin() && $pagenow == 'edit.php' && $post_type == 'page' && current_user_can('custom_role') ) {
        $query->query_vars['post__not_in'] = $pages;
    }

}