Un modo per farlo sarebbe definire l'alias di colonna a un livello diverso in modo da poterlo fare riferimento due volte senza ripetere l'espressione.
SELECT *,
Row_number() OVER (ORDER BY
CASE WHEN @SortBy LIKE '% ASC' THEN sort_col END ASC,
CASE WHEN @SortBy LIKE '% DESC' THEN sort_col END DESC) AS RowNumber
FROM YourTable
CROSS APPLY (SELECT CASE
WHEN @SortBy LIKE 'column1 %' THEN Cast(column1 AS SQL_VARIANT)
WHEN @SortBy LIKE 'column2 %' THEN Cast(column2 AS SQL_VARIANT)
WHEN @SortBy LIKE 'column3 %' THEN Cast(column3 AS SQL_VARIANT)
WHEN @SortBy LIKE 'column4 %' THEN Cast(column4 AS SQL_VARIANT)
END) C(sort_col)
Tuttavia, prenderei in considerazione l'utilizzo di SQL dinamico per questo. Questo tipo di query catch all ucciderà l'idea di ottenere un buon piano in grado di utilizzare gli indici per evitare un ordinamento.