As we all know, there is almost always 20 ways to solve the same problem. This just represents the one that I felt was the best fit for our environment and situation. In our world we have a few procedures and functions that can only be done in CLR and we currently deploy the CLR assembly to every one of our 200+ servers already. Once we have jumped that hurdle, it is just as easy for us to deploy new CLR sprocs as it is to deploy T-SQL ones.
I have considered using Power Shell but we needed something that would integrate completely inside of T-SQL. We have been making attempts to remove all xp_cmdshell calls with more efficient procedures or functions that integrate into the SQL code better. At this point PS is just not integrated well enough into SQL.
As far as the Agent Job's, I have created processes in the past to run asynchronously by spinning up dynamic agent jobs but have found this to be much more cumbersome that a single sproc. The other problem with an agent job strategy for this purpose is that you would then need to build in a looping monitor that does not move forward until all the files have been copied. I also believe that extra overhead of the agent method would not be as fast for a large number of small files while it might be just as good for a small number of large files.