Yes, that's right. the calls to A().prepare() on the same actor value can't be run in parallel, but the code in your second call to A().prepare() can run concurrently with the first call to b.prepare() if b is not isolated to the actor that stores it. The behavior of actors where they are freed up to do other work while waiting on an async function to finish is called actor re-entrancy, and it's what allows Swift concurrency to always make forward progress.
Right, isolated parameters are the only way to accomplish the effect you're describing right now. There are some other ideas for isolating an entire non-Sendable type to an actor value being discussed over in Isolation Assumptions - #56 by Nickolas_Pohilets