"Connecting directly" in this context is ambiguous. Applications running directly on the Pi, using the I2C bus, would generally use some kind of library interface, such as the various Pi specific (eg. pigpio) or linux specific (I would guess python has something like that) things or the kernel API.
Point being, there is no singular "connect to the bus" mechanism. If you have been working with I2C at all, you must be somewhat aware of this.
Using ssh
(or anything that networks a shell) would in fact be the closest you will get to directly interfacing with the bus in the sense that you could use the command line like you do locally.
You can instead use a custom socket if you want. However, I doubt there is an existing generic TCP <-> I2C interface application, meaning you'd have to create your own. In the end, unless you also want to pointlessly reinvent the wheel represented by pigpio, whatever python module, the kernel API etc. you'd have to choose one of those to back your implementation. This is a perfectly fine idea, but it will be much, much more work than using ssh
or MQTT.
Sockets of any sort and existing I2C interfaces are simply too dissimilar to "connect directly" in the way that you could, for example, directly connect a socket and a UART interface.