Try changing this
esc_attr($_POST['gift_wrapping'])
To this
(esc_attr($_POST['gift_wrapping'] = 1 ? 'yes' : ''))
I have tested this on a woocommerce test site I have and working for me.
This will return yes if ticked and nothing if unticked. If you are dead set on having no, then you can change the whole line from this
if ($_POST['gift_wrapping']) update_post_meta( $order_id, 'Include Free Gift Wrapping', esc_attr($_POST['gift_wrapping']));
To this. Which will force the save of a value even if the value has not technically been set.
update_post_meta( $order_id, 'My Field', (esc_attr(isset($_POST['gift_wrapping']) && $_POST['gift_wrapping'] == 1 ? 'yes' : 'no')));