Assuming I've understood what you're on about you might have to do your delete as:
DELETE FROM dbo.cart C
LEFT OUTER JOIN
(SELECT
@sessionid as sessionid
,ISNULL(o.free_subsku,0) as subsku
,o.free_sku as mainsku
,ko.cartrsn
,o.qty_free * ko.qty as qty
,COALESCE(sp.price,p.price) as price ,COALESCE(sp.[weight],p.[weight]) as [weight]
FROM offer o
inner join @cart_offer ko on o.id = ko.offer_id
inner join products p on o.free_sku = p.sku
left join subproducts sp on o.free_subsku = sp.sku
WHERE o.active = 1 and o.offer_type = 'GWP'
) D
ON C.sessionid = D.sessionid
and C.mainsku = D.mainsku
and C.subsku = D.subsku
WHERE D.sessionid IS NULL
AND C.sessionid = @sessionid
As I said earlier, you need to look at your query plan to ascertain what is going on.