Custom Field created in add_meta_boxes reappearing itself again in the default Custom Metabox

Prepending your metakey with an underscore _ makes it private and prevents the data from showing up in the default metabox.

So instead of this,

update_post_meta( $post_id,'product_desc_en', wp_kses_post( $_POST['product_desc_en'] ) );

do this,

update_post_meta( $post_id,'_product_desc_en', wp_kses_post( $_POST['product_desc_en'] ) );

and your custom meta shouldn’t show up in the default metabox.

P.s. And of course, when using get_post_meta(), you’ll need to use the underscored metakey to fetch the data.

https://developer.wordpress.org/plugins/metadata/managing-post-metadata/#hidden-custom-fields

As a side note

add_meta_boxes and save_post are general hooks, which means your callbacks are fired whenever the actions run. So you’re codes run in cases when they’re not strictly required, e.g. when saving a post of some other type. If you want, you can use post type specific hooks (add_meta_boxes_product and save_post_product) to limit your code only to the required cases.

Also, you can add an extra level of (healthy) paranoia to your code with nonces and capability checking to make sure that the meta data is saved only when intended.

To add a hidden nonce field to your metabox,

function english_product_name_callback( $post ) {
  wp_nonce_field( 'my_save_action_' . $post->ID, 'my_save_action_' . $post->ID );

  // your code
}

Nonce and capability check when saving,

function enginfo_save_meta_box( $post_id, $post, $update ) {
  if ( ! current_user_can( 'edit_post', $post_id ) ) {
    return;
  }
  $nonce = ! empty( $_POST['my_save_action_' . $post_id] ) ?  $_POST['my_save_action_' . $post_id]: '';
  if ( ! $nonce || ! wp_verify_nonce( $nonce, 'my_save_action_' . $post_id ) ) {
    return;
  }

  // your code  
}
add_action( 'save_post_product', 'enginfo_save_meta_box', 10, 3 );