Se me ocurre una manera de resolver esto; en tu $validate escribes algo como: 
   Código PHP:
            'p5' => array(
            'obligatoriaXp4' => array (
                'required' => true,
                'rule' => array('dependeP4','p5'),
                'message' => 'Por favor, responda la pregunta'                
            ),
        ), 
    
  En donde indicamos que p5 (pregunta 5) es obligatoria por pregunta 4 (obligatoriaXp4) entonces en el 
'rule' llamo a la función que valida dicha condición (incluso le mando un argumento):  
 Código PHP:
    'rule' => array('dependeP4','p5'), 
    
  Abajo del $validate ya puedo declara la función que podría ser algo asi:  
 Código PHP:
        function dependeP4($data, $pregunta){
        $valida = true;
        if( $this->data['Encuesta']['p4'] == 'p4_r1' ){
            if( $data[$pregunta] == '' ){ $valida = false; }
        }
        return $valida;
    } // dependep4 
    
  Si te fijas estoy validando la pregunta 5 a partir de la respuesta de p4 y regreso true o false que sería el resultado de la validación. 
Espero que te sirva. 
Saludos