Blazor server hosts the client app instance on a dedicated thread on the server (one thread per client connection). a small js app runs in the browser that opens a signal/r connection to the server app. it sends events to the server app via this connection. the server app sends html updates to the js app also via the connection, which renders the dom updates.
Blazor WASM is a Blazor app hosted in the browser. Other than initial download, no server connection is required. It still uses js to update the browser, but its a local message.
Blazor server can make any api calls supported by the server (database, O/S, etc). Blazor WASM can use any api available to browser js (as can Blazor server via interop, but there is a network hop).
Blazor server requires a persistent connection to the server. Blazor WASM can run offline.
Blazor server UI performance depends on network latency. The UI events and updates are in the riser, the blazor code is on the server. You would not want to do mouse tracking for instance.
Blazor WASM main performance hit is the initial app load.