WooCommerce maintains its own session handler backed by a database table and a cookie, entirely separate from $_SESSION. Code that starts a PHP session to store something cart-related is running two session systems that know nothing about each other.
WC()->session->set( 'chosen_gift_wrap', $id );
WC()->session->get( 'chosen_gift_wrap' );
The reason it exists is caching: a PHP session cookie makes a page uncacheable for everyone, whereas the WooCommerce cookie is only set once there is something in the cart. The session is not available before woocommerce_init, and it is not available at all for a request the plugin considers cacheable — so a null return is a normal condition rather than an error.