This sounds like the Rexx is not very well optimized. 100K records is not too many for Rexx to handle. It is slower than SORT but for 100K records it should not take more than a minute or two at the most. If the Rexx is short, post it here.
From your description, it sounds like the all of the records are 2 character representations of Hex [0-9A-F] that you want to convert to corresponding single characters eg hex 'C1F2' -> 'A2'. Is that right?
If not, then you are probably using substring too much. Use Parse instead. Limit the use of stem variables to just those you use for I/O and don't do the conversion character by character (the only reason I can imagine it takes 2 hours) - do the whole line at one time.
Glad you found a solution. Just a note that as far as Rexx goes, it would be worthwhile to take a few minutes and review the whole list of built in functions because there are many string processing built-ins that can handle large amounts of data. As you can see. the x2c() function does in 1 fast call what you had in many lines. More importantly though, run a few tests on different methods to get an idea of what is relatively slow (stems, string concatenation) and what is sort of slow (loops, I/O) and what is fast (some of the built in functions). It is sometimes an interesting exercise even if it is just done to learn.