My recommendation is to build 8 interrupt functions, two for each button, one for GPIO.RISING and one for GPIO.FALLING. You also keep a binary variable (e.g. int) which has bit 0 = button 1 (i.e. mask 0b00000001), bit 1 = button 2 (i.e. mask 0b00000010), ... , bit 3 = button 4 (i.e. mask 0b00001000). Upon entering the RISE callback for button 1, it sets its corresponding bit, and the FALL callback for the button sets it back to 0.
In each RISE callback function you then test with a bit mask to see if a desired combination of buttons (using a simple mask, e.g. 0b00001100 for button 3&4) has been pressed, and you trigger the corresponding interrupt function.
Something like this:
buttonRegister = buttonRegister | 0b00000001
if buttonRegister & 0b00000011: #test for button 1 & 2 pressed
buttonRegister = buttonRegister & 0b11111110
For the timer related question, I would have the RISE callback code create a timer thread (with the code to be executed after the time interval in that thread), and the FALL callback code cancel the timer thread.