You could try this, loop through all the wp_nav_menu
items, get the post using the Object ID then test to see IF the content is empty. IF that content is empty then unset it from the items array:
function remove_empty_items( $items ) {
$blog_page = get_option( 'page_for_posts' );
$home_page = get_option( 'page_on_front' );
$postArr = get_posts ( 'post_type=post' );
foreach( $items as $key => $item ) {
$tmpPost = get_post( $item->object_id );
if( $item->object_id == $blog_page && empty( $postArr ) ) {
unset( $items[$key] );
} else if( $item->object_id !== $home_page && empty( $tmpPost->post_content ) ) {
unset( $items[$key] );
}
}
return $items;
}
add_filter( 'wp_get_nav_menu_items', 'remove_empty_items' );