Except.it doesn't, look at the Berkeley sockets api, it's a c API so not OOP, yet it also uses polymorphism based upon the passed data types of the sockaddr struct. If you pass a sockaddr_in to bind it will call the respective ipv4 functionality, if you pass a sockaddr_in6 to bind it will execute the respective code for ipv6.
Similarly if you call send on a UDP socket the UDP packet will be sent, while if you call it on a tcp socket you write data to a stream. Polymorphism over the data type without OOP
I know that you are quite familiar with the windows API, and the windows API does runtime polymorphism based on the data type passed all the time. So how can you claim it's only possible in OOP?
Infact polymorphism based on the data type passed, using common prefixes for data types is a well established practices long before OOP became a thing. Nothing in OOP is actually new and you can't boil OOP down to a single design decision, it's the combination of the 4 aspects above.