I assume that the result of the rename operation must be known. I.e. if it was successful or not, or which files were affected. That implies 2 function calls. One to start the operation, and one to query its result. That is, by definition, already an asynchronous interface.
The only other (i.e. synchonous) way to achieve remote procedure calls is by blocking until it's finished.
If you insist on showing the result of a rename on the next frame, then yes, it must block the next frame until it's done.
Would you write your editor that way if it didn't use LSP but was specific to one language? If not, but you would write it that way with a language plugin, why? You still have to write a good product. You can't blame the plugin API for everything you get wrong.