Whether it works with ZMQ or not depends on how you intend to handle the sockets and threading on your server. It's entirely unclear whether you intend the server threads to handle the ZMQ communication, or if all of the ZMQ communication happens in a single thread, and the other thread-per-process communicates back to the main thread for ZMQ to send back to the client. The latter scenario would be the "ZMQ way", the former requires a few more hoops to work correctly.
If you want all ZMQ communication to happen in a single thread, then you just need to keep track of new clients as they connect, spin up a thread and the communication with that thread (which could happen over a separate pair of ZMQ sockets if you like), and then as the clients disconnect, spin down the thread. Fairly straight forward as an architecture.
If you'd prefer to have each thread handle ZMQ communication back to its client, things get a little hairy. You cannot have a single socket on the server be available to all threads, for each to use to communicate back to its client simultaneously. ZMQ sockets are not threadsafe. They are intended to be used by one thread at a time, serially, and it's recommended against passing them around among threads (but can be done by executing a full memory barrier - unsure what it takes to accomplish this in python, if it's possible; it's suggested here that the Python GIL may accomplish this "for free" - if you choose to rely on that behavior, good luck).
The way to do this the "ZMQ way" would be to accept an incoming connection in the main thread, spin up a thread with a new socket (it can use the same ZMQ context, which is threadsafe), communicate back to the client which new port is being bound on, have the client disconnect from the main socket and reconnect to the socket in the new thread. When it disconnects, have that thread terminate. A bit of a kludge, but workable if that's what you're after.
If either of these methods works for you, I'd use DEALER(client)/ROUTER(server) as your socket types to support fully asynchronous communication. Chapter 4 of the guide gives you some possible communication patterns to start with for various goals.
REQ-REPsocket pairs.