Your bplay synthdef is passing its \buf control through to PlayBuf’s bufnum parameter. Deep in the bowls of the SC library, it is calling .asControlInput assuming that it will get a bufnum back. This is what allows you to pass a buffer rather than a bufnum. Rest(1) also implements asControlInput which returns the value/duration of the rest. Rest(1).asControlInput returns 1, Rest(2).asControlInput returns 2. These cause PlayBuf to play those buffers.
It doesn’t look like it’s possible to use Pif (or the ilk) and Pkey on the \dur element to access the \buf to see if it’s a rest. That wouldn’t really work anyway since you have two parallel patterns and really wouldn’t want to have both of them rest.
Someone with more SC experience than me might be able to figure out how to write a Synthdef that checks the current \buf control to see if it’s a rest and then either use PlayBuf or an empty signal.