I have "solved" it with a counter timeout in all "while" loops. Now Arduino doesn't freezes, but I cannot found, there is no way to initialize or recover again the I2C Network without Reset Arduino.
I handle this pretty much the way you suggest (using a 5000 microseconds timeout), but when a state timeout is detected (assuming a bus issue), I call twi_init. For this to be effective, you also need to add the following statement to the top of twi_init:
void twi_init(void)
{
// disable twi module (to allow for reinitialize)
TWCR = 0;
// ... original code follows
// initialize state
twi_state = TWI_READY;