I don't think any of those will work. You don't get an exit code until after the process is complete, so you can't test for it until then. Also, most bash actions are run sequentially, so it's not a simple task to get two operations going at the same time (such as testing the status while the program is running). Finally, $? outputs the exit status of the last
command run in that shell, so it will be testing whatever you did before the loop.
In most cases, all you really need to do is echo a line before the command stating that you're starting the job, then output the exit status afterwards. That's what most people do.
echo "copying file foo"
cp foo foo_foo && echo "file foo copied" || "failed to copy file foo"