You mention that the "heavy work" is being done in C++. Why don't you rewrite your C++ to be threaded in the background? That way the lisp could call the C++
defun'ed function. It would then start the thread to do the calculation(s) and return to lisp. The thread can then have a call to
acedInvoke to tell lisp that the calculation is complete and send it the result(s). The defun in lisp needs to be sent to vl-acad-defun though so it can be invoked from the C++ side. I know it's a lot of work to create some threaded class simply for a calculation, but that's what you get from C++ (it's the most common of the closest "3rd" generation language to being a "2nd" generation Assembly Language).
You might even design your calculating thread to send a % complete every now and again. Thus either using lisp to display the status, or directly in C++ modify the
progressbar. You'd probably need to use some form of event function in your threaded class for this.
Yet something else where ADesk cause their customers hassles by not upgrading AutoLisp to any one of the Common Lisp interpreters/compilers - all of them have threading built in - a lot less work than doing it in C++.