The main rationale was likely the benefit of guaranteed delivery order - keep in mind Modbus was originally a serial protocol and while missed packets could happen from communication errors, out-of-order packets was just impossible. With UDP, order of delivery is not guaranted. After that, I guess the fact TCP is session-oriented and retransmission is automatic was also seen as a benefit rather than having to implement all this on a higher level.
I sometimes miss a packet-oriented (like UDP) with built-in retransmission and ordering (like TCP); not on top of TCP/UDP, but at the same level, as alternative. TCP does a lot of useful things, and then forces an abstraction where the user-accessible datagram is exactly 8 bits, so if you need larger frames, as every real application in existence does, you the build a packetization system on top. Every usual layer on top of TCP, including HTTP, MQTT etc. are fundamentally packet delimiter systems (with application-specific extra features). The simplest ad-hoc packetization is a length field followed by any data; because TCP never loses anything, that suffices: you read the length field, then the correct amount of data, and are guaranteed to have the next length field. But this is still unnecessary work and it fights with layers below (Nagle, delayed ack, etc.) which try to figure out where application's data boundaries are.
Modbus TCP vendors seem to struggle somewhat, we have seen implementations which eventually crash if you keep doing polls on an open socket, forcing you to do a state machine on the application side which opens socket, communicates, checks everything went well, closes socket, and only then declares the operation finished. UDP would not be any more complicated, but simpler: still the same "retry until success" state machine, but without connection management.