This is a set-based approach:
;WITH Tally (n) AS ( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n) CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n) CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n) ), UnpivotCTE AS ( SELECT id, xc, n, y.isNumber, n - ROW_NUMBER() OVER (PARTITION BY id, y.isNumber ORDER BY n) AS grp FROM mytable CROSS JOIN Tally CROSS APPLY (SELECT SUBSTRING(col, n, 1)) AS x(c) CROSS APPLY (SELECT ISNUMERIC(xc)) AS y(isNumber) WHERE n <= LEN(col) ), ToConcatCTE AS ( SELECT id, c, n, isNumber, grp + MIN(n) OVER (PARTITION BY id, isNumber, grp) AS grpAsc FROM UnpivotCTE ) SELECT id, col, REPLACE( (SELECT c AS [text()] FROM ToConcatCTE AS t WHERE t.id = m.id ORDER BY id, grpAsc, CASE WHEN isNumber = 0 THEN n END, CASE WHEN isNumber = 1 THEN n END DESC FOR XML PATH('')), ' ',' ') AS col2 FROM mytable AS m
A table of tables is used to "disable" all characters in a string. ROW_NUMBER is then used to identify islands of numeric and non-numeric characters. Finally, the FOR XML PATH used to restore the original string with the changed numeric islands: ORDER BY used to sort the islands of numeric characters in reverse order.
Script Demo here