As NisshokuZK says, it’s not really something you’ll be able to avoid, more something you can just try to minimize as much as possible. One possibility would be to move as much calculation as possible into a precomputation stage. I think it’s a fair assumption that the majority of concealment objects will be static. You could generate a spatial subdivision and calculate conservative concealment values between pairs of cells based only on static concealers. So then you know for example that every point in cell X is concealed from every point in cell Y. At runtime you then do a quick lookup based on the current cells of your source and target to determine concealment by static objects, and if necessary combine this with results of ray traces for dynamic concealers.
If you want different concealment objects to have varying degrees of concealment (eg. wall is stronger than bush) then it becomes a little more difficult. You could still do it, you’d just have to trade off some precision for speed gains.
I’d probably just go ahead and implement it using dynamic raytracing first though. You may find that by making the system sufficiently asynchronous (which I think you’re going for anyway) that you don’t end up needing a prohibitive number of traces per frame in order to get good results.