A WooCommerce order status is a post status, and that constrains it

Order statuses are registered post statuses prefixed with wc-, which means a custom one is a core registration and the twenty-character post status limit applies.

add_action( 'init', function () {
    register_post_status( 'wc-awaiting-stock', array(
        'label'                     => _x( 'Awaiting stock', 'Order status', 'turkerdev' ),
        'public'                    => false,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop(
            'Awaiting stock <span class="count">(%s)</span>',
            'Awaiting stock <span class="count">(%s)</span>',
            'turkerdev'
        ),
    ) );
} );

add_filter( 'wc_order_statuses', function ( $statuses ) {
    $statuses['wc-awaiting-stock'] = _x( 'Awaiting stock', 'Order status', 'turkerdev' );

    return $statuses;
} );

Both steps are required and doing only the first produces a status that exists and never appears in the admin dropdown. Reports, emails and the payment gateways all switch on status strings, so a new one is invisible to every one of them until it is added to their lists explicitly. That is the real cost: a custom status is not a new state so much as a promise to update everything that enumerates states.