I believe there is a conflict with the timers used to generate the motor pwm and the timer used for the IR receive.
My thinking is that they are both using Timer2.
I think if you use motor3 and motor4 you will use Timer0 at some higher frequency and loose the millis() timing.
The read me for the IRremote library
https://github.com/Arduino-IRremote/Arduino-IRremote
has a section about changing the timer used by the library.
I think you want to modify the library file on your computer. You will need to find the library file called
private/IRTimer.hpp and change this section to use Timer1 instead of Timer2.
* Plain AVR CPU's, no boards
***************************************/
// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, etc
// ATmega328
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328PB__) || defined(__AVR_ATmega168__)
# if !defined(IR_USE_AVR_TIMER1) && !defined(IR_USE_AVR_TIMER2)
//#define IR_USE_AVR_TIMER1 // send pin = pin 9
#define IR_USE_AVR_TIMER2 // send pin = pin 3
# endif
Change these two lines.
#define IR_USE_AVR_TIMER1 // send pin = pin 9
//#define IR_USE_AVR_TIMER2 // send pin = pin 3