Solution:
The way is to use a custom funtion hooked in woocommerce_checkout_update_customer
action hook:
add_action('woocommerce_checkout_update_customer','custom_checkout_update_customer', 10, 2 );
function custom_checkout_update_customer( $customer, $data ){
if ( ! is_user_logged_in() || is_admin() ) return;
// Get the user ID
$user_id = $customer->get_id();
// Get the default wordpress first name and last name (if they exist)
$user_first_name = get_user_meta( $user_id, 'first_name', true );
$user_last_name = get_user_meta( $user_id, 'last_name', true );
if( empty( $user_first_name ) || empty( $user_last_name ) ) return;
// We set the values by defaul worpress ones, before it's saved to DB
$customer->set_first_name( $user_first_name );
$customer->set_last_name( $user_last_name );
}
Code goes in function.php file of your active child theme (or theme) or also in any plugin file.
Tested and works in WooCommerce 3+