How can I apply custom sanitization to new usernames?

sanitize_user function has a sanitize_user filter. The filter gives you $username, $raw_username, $strict from the sanitize_user and expects you to return $username, according to the inline documentation:

/**
* Filters a sanitized username string.
*
* @since 2.0.1
*
* @param string $username     Sanitized username.
* @param string $raw_username The username prior to sanitization.
* @param bool   $strict       Whether to limit the sanitization to specific characters. Default false.
*/

You would do something like:

function wpse_283736_sanitize_user_filter($username){
    // do your sanitization with $username
    return $username;
}
add_filter('sanitize_user', 'wpse_283736_sanitize_user_filter');

Or like this

function wpse_283736_sanitize_user_filter($username, $raw_username, $strict){
    // do your sanitization with $username or maybe $raw_username
    return $username; // or return $raw_username;
}
add_filter('sanitize_user', 'wpse_283736_sanitize_user_filter', 10, 3);

You could hook to pre_user_login filter, available on wp_insert_user function, which is used by Woocommerce user registration process.

$pre_user_login = apply_filters( 'pre_user_login', $sanitized_user_login );

function wpse_283736_pre_user_login_filter($sanitized_user_login){
    // do your sanitization with $sanitized_user_login
    return $sanitized_user_login;
}
add_filter('pre_user_login', 'wpse_283736_pre_user_login_filter', 10, 3);

If you are not familiar with WordPress Filters, I suggest you read these references first:

Hope it helps you.