I2C is properly an open collector
(well, today, open drain
) bus, which is to say that the active devices only ever drive low, and the pullup resistors are relied on to raise the bus to the supply rail otherwise.
So for a starting point, you'd want to be sure that your only I2C pullup resistors connect to a 3.3v rail, and that you have none on the Arduino board or elsewhere which would connect to 5v.
The ATmega chips used in typical Arduino's have specifications that indicate they work fairly well with 3.3v inputs when running off a 5v supply, so reading the signal should be fine.
The greater challenge is that you would need to be sure that at no time does the Arduino ever actively drive the I2C lines high, for example, due to software error or loading of a different program. (Arguably you also want to make sure it never activates the internal pullups, but those are fairly weak and so less likely to be a problem).
If you can't make this guarantee, I2C is also fairly compatible with MOSFET-based level shifting, and such modules are sold by many sources. Here's an excerpt from one channel of the the schematic of Sparkfun's version. You'd probably want to replace (or simply parallel) those 10K resistor with resistors of a more typical I2C bus pullup value.

And of course you'd also want to measure the actual operating voltage of the board rather than assume that it is 3.3v. With the MOSFET level translator, you have wide latitude even for something like a 1.8v I2C on the low side. But without the level translator, you need to be sure that the I2C bus voltage is high enough to be reliably read as a 1 by your Arduino, which it may not be if it is substantially lower than 3.3v.