Polling several buttons from an interrupt
Made a lot of progress, there were 2 problems.

As suggested by Martin and kkrambo there was the issue of correctly tracking the state of all 3 buttons. The code I posted kept a static history variable.
Now the main code includes 3 different history variables.

uint8_t mute_history=0;
uint8_t volp_history=0;
uint8_t volm_history=0;

uint8_t read_btn(uint8_t  curbtn){
uint8_t ret=0x00;
if (curbtn==0x01){
    DDRB &amp;=~_BV(PB2);//PB2 en entree
    PORTB |=_BV(PB2);//pull-up actif
    nop();nop();nop();nop();
    ret= ( (PINB &amp; _BV(PB2)) == 0 );
} else if (curbtn==0x02){
    DDRB |=_BV(PB2);//PB2 en sortie
    PORTB &amp;=~_BV(PB2);//PB2 a 0
    DDRB &amp;=~_BV(PB0);//PB0 en entree
    PORTB |=_BV(PB0);//pull up sur PB0
    nop();nop();nop();nop();
    ret= ( (PINB &amp; _BV(PB0)) == 0 );
} else if (curbtn==0x04){
    DDRB |=_BV(PB0);//PB0 en sortie
    PORTB &amp;=~_BV(PB0);//PB0 a 0
    DDRB &amp;=~_BV(PB4);//PB4 en entree
    PORTB |=_BV(PB4);//pull up sur PB4
    nop();nop();nop();nop();
    ret= ((PINB &amp; (1&lt;&lt;PB4)) == 0);//lecture de PB0
}
return ret;
}

uint8_t debounce(uint8_t  *button_history,uint8_t  curbtn){
uint8_t pressed = 0;
*button_history = *button_history &lt;&lt; 1;
*button_history |= read_btn(curbtn);
if ((*button_history &amp; 0b11000111) == 0b00000111) {
    pressed=1;
    *button_history = 0b11111111;
}
return pressed;
}


ISR (WDT_vect){

if (debounce(&amp;volp_history,0x02)==1){
    PORTB ^= _BV(PB3);//flip led 2
}

if (debounce(&amp;mute_history,0x01)==1){
    PORTB &amp;= ~_BV(PB1);//turn off
    PORTB &amp;= ~_BV(PB3);//turn off
}

if (debounce(&amp;volm_history,0x04)==1){
    PORTB ^= _BV(PB1);//flip led 2
}

}


The second issue was a timing one, which was suggested to me by user Tom Carpenter in this thread. His comments were:


  @Polyphil try adding some nop instructions. You can use the following: #define nop() __asm__ __volatile__ ("nop \n\t"), and then in your code do nop();nop();nop(); just before you do the return statement.
  
  @Polyphil the inputs on the ATTiny have a two clock cycle latency due to a synchroniser chain, so it takes at least 2-3 clock cycles after changing the pull-up value before it is reflected in the PIN register. Adding a nop causes the processor to wait a clock cycle. 


hence the nops(). 

The circuit behaves as expected at the moment.