• This should get you started:

    ;WITH SequencedData AS (

    SELECT *, rn = ROW_NUMBER() OVER(PARTITION BY order_id ORDER BY [Priority])

    FROM #set_dates

    )

    SELECT

    [Split3_ID], [CU_ID], [order_id], [st_date], [sku], [Priority],

    o.[Delay],

    [CourseDate] = CASE WHEN o.rn = 1 THEN o.[st_date] ELSE DATEADD(DAY,x.[Delay],o.[st_date]) END

    FROM SequencedData o

    OUTER APPLY (

    SELECT [Delay] = SUM([Delay])

    FROM SequencedData i

    WHERE i.order_id = o.order_id

    AND i.rn < o.rn

    ) x

    ORDER BY [Split3_ID]

    “Write the query the simplest way. If through testing it becomes clear that the performance is inadequate, consider alternative query forms.” - Gail Shaw

    For fast, accurate and documented assistance in answering your questions, please read this article.
    Understanding and using APPLY, (I) and (II) Paul White
    Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden