Remove while loop from query inserting x values
I believe I have solved it with the following cte and cross apply. Thanks to Aaron for letting me think it was simpler than I had it.

;WITH cte AS
(
SELECT 
    D.Id, D.WidgetTypeId
FROM 
    @Widgets R 
    CROSS APPLY 
    (
        SELECT 
            TOP(R.Required) *
        FROM 
            WidgetOrder A
        WHERE 
        A.OrderId IS NULL AND A.WidgetTypeId = r.WidgetTypeId) D
)
UPDATE A SET OrderId = 100 FROM WidgetOrder A JOIN cte ON A.Id = cte.Id