Bug in CiviContribute - PayPal Express not working for recurring contributions
Ok, I think I have finally got to the bottom of this.

Firstly, one of the problems was that I had not got the payment notifications set up in PayPal (mea culpa).  

However, even with this fixed, the notifications were not being processed.  I narrowed this down to the handlePaymentExpress() method in PayPalProIPN.php.  There are two errors here, both related to the "is test" status.  At line 578, it attempts to get the Contribution record.  However the call:

   $result = civicrm_api3('contribution', 'getsingle', array('invoice_id' =&gt; $input['invoice']));


only works for live contributions, it doesn't find test contributions.

The other error is at line 597:

    $paymentProcessorID = self::getPayPalPaymentProcessorID();


Again, this only works for live, not test.

I'd love to log the issue on the CiviCRM website, but two requests for an account have been ignored.  Oh well.