In development I don't need it to be multi-threaded. 1 thread is fine, as long as I can explain, step-by-step, how the calculations produced the output.
If you don't need threads in development OR production, you might as well do SELECT * from users and do the join in your imperative code.
If you need threads in production I think you will end up getting rid of your for loops anyway (or possibly, if you really want to, end up in a mutex/semaphore quagmire).
I must say, though, that there are other benefits with a declarative approach than just avoiding threading issues. But I guess it takes some getting used to.
I would say that the same "I cant step through my code" argument also goes for functional style code.