Xbee not responding timely. Large delay between each transmission
I'm not 100% sure this will fix your problem but normally before sending data you'd want to check that the transmitter holding register is empty before sending a character. You could try this:

ISR(USART_RX_vect)      // ISR for receive complete interrupt
{
    data = UDR0;  //making copy of data from UDR0 in 'data' variable 
    if(data == 0x33)
    {
        while(!(UCSR0A &amp; (1 &lt;&lt; UDRE0))) // Wait for data register to be empty
            ;
        UDR0 = data;                //echo data back to PC
    }
}


But doing the wait inside the interrupt might cause you to miss received characters. Instead I'd normally do something more like this:

volatile unsigned char data, got_data;
unsigned char buffered_data;

ISR(USART_RX_vect)      // ISR for receive complete interrupt
{
    data = UDR0;  //making copy of data from UDR0 in 'data' variable 
    got_data = 1;
}

int main(void)
{
    init_devices();
    while (1)
    {
        if (got_data)
        {
            // Ideally you should disable interrupts here
            buffered_data = data;
            got_data = 0;
            // And re-enable interrupts here
            if (buffered_data == 0x33)
            {
                while(!(UCSR0A &amp; (1 &lt;&lt; UDRE0))) // Wait for data register to be empty
                    ;
                UDR0 = buffered_data;                //echo data back to PC
            }
       }
    }
}


I also just noticed your addition about the clock having a potential innacuracy of +/- 10% which is a bit large for reliable communications. While I normally aim for 2% accuracy when using serial communications you should aim for less than 5% otherwise you can about half a bit out by the end of 10 bits.