Have you got some routine in the Arduino to reset the i2c bus? If one of the slave devices is sending a low level signal, it will hold the data bus low until it has received a clock pulse.
You can clear an i2c bus by letting the data line be pulled high and sending enough clock pulses to finish any data word that the slave devices may be sending. By not acknowledging any of the transmission, the slave devices will return to their idle states.
I have experienced microcontroller i2c modules that won't initiate transmission if either line is low. So if the microcontroller thinks that the data is finished and the slave device doesn't, there is no way out. The work-around is to turn off the i2c module, make the clock line an output (preferably open drain) and toggle the clock line 10 times or so. After that, enable the i2c module and start again.
If you want to know exactly what is causing the lock up, post your code and the waveforms that you get just before the lock up.