You can only have one when guard per arrow/result, so something like this would work:
let id1 = 0
match p1, p2 with
| Fluid, Particle id2
| Interface _, Particle id2 when id1 = id2 -> doSomething()
| _ -> doSomething()
(note in this case both items in the or must bind the same set of identifiers so that in either case no identifer is left uninitialized)
or alternatively add a second action/result:
match p1, p2 with
| Fluid, Particle id2 when id1 = id2 -> doSomething()
| Interface _, Particle id2 when id1 = id2 -> doSomething()
| _ -> doSomething()