You should scape data when displaying it, not when saving. To sanitize, I think the best choice in this case is sanitize_text_field()
if( isset( $_POST['my_meta_box_select'] ) ) {
update_post_meta( $post_id, 'my_meta_box_select', sanitize_text_field( $_POST['my_meta_box_select'] ) );
}
Then, only if you are going use the data as attribute you should use esc_attr():
$selected = isset( $values['my_meta_box_select'] ) ? esc_attr( $values['my_meta_box_select'][0] ) : '';
<select name="my_meta_box_select" id="my_meta_box_select">
<option value="asia" <?php $selected == 'asia') ? 'selected'; ?>>Asia</option>
<option value="africa" <?php $selected == 'africa') ? 'selected'; ?>>Africa</option>
<option value="america" <?php $selected == 'america') ? 'selected'; ?>>America</option>
</select>
If you want also validate the data, you should compare with a list of valid values (or other validation comparison), as Rarst suggested in his answer (in this case you could skip the sanitization because if the value has a not valid value you don’t trigger the update_post_meta()
function):
if( isset( $_POST['my_meta_box_select'] ) ) {
$value = $_POST['my_meta_box_select'];
if ( in_array( $value, array('asia', 'africa', 'america'), true ) ) {
update_post_meta( $post_id, 'my_meta_box_select', $value );
}
}