Have you checked this discussion https://github.com/orgs/micropython/discussions/11474? Since MicroPython version 1.20.0 the W5500 is supported by MicroPython (from Espressif ESP-IDF implementation). So I think that if you use that, everything else (like as mqtt client and any other protocol, including ssl) will be transparent because that espressif W5500 implementation (and micropython support) is using a raw ethernet implementation.
Can anyone confirm if what I did write is correct?
The official umqtt.simple from micropython-lib does not support setting the 'sock'.
Only client_id,server, port, user, password, keepalive, ssl is possible.
Also umqtt.simple uses a normal socket. When using Websockets, all MQTT packets are wrapped in a Websocket packet so it is not possible, without significant modifications, to use it in umqtt.simple.
I have made a async MQTT-client using Websockets. I use a patched version of aiohttp. The modifications to aiohttp were necessary because aiohttp does not accept headers (which are needed for almost every broker). Even then, aiohttp can still be blocking because the used getaddrinfo is still a blocking function, therefore I use my own developed, fully async, version of getaddrinfo.