Claim: perp(U+Z) subset W.

We show:  If p is a antisymmetric (2,2)-tensor and:
                  <p,u> = 0 for all u in U,  
                   <p,z> = 0 for all z in Z,
                   then p in W.

PN[a_,b_,i_,j_]:= Signature[{a,b}] Signature[{i,j}] pp[Min[{a,b}],Max[{a,b}],Min[{i,j}],Max[{i,j}]]

The below constraints are copied from ZisNonDegenerate.nb. If z is in Zperp, then z satisfies the below conditions.

ConsTemp={z[2,3,1,3]==z[2,4,1,4],z[2,3,1,2]+z[3,4,1,4]==0,z[2,4,1,2]==z[3,4,1,3],z[1,3,2,3]==z[1,4,2,4],z[1,3,1,2]==z[3,4,2,4],z[1,4,1,2]+z[3,4,2,3]==0,z[1,2,2,3]+z[1,4,3,4]==0,z[1,2,1,3]==z[2,4,3,4],z[1,4,1,3]==z[2,4,2,3],z[1,2,2,4]==z[1,3,3,4],z[1,2,1,4]+z[2,3,3,4]==0,z[1,3,1,4]==z[2,3,2,4],z[1,2,1,2]+z[1,4,1,4]+z[2,3,2,3]+z[3,4,3,4]==2 (z[1,3,1,3]+z[2,4,2,4]),z[1,3,1,3]+z[2,4,2,4]==z[1,4,1,4]+z[2,3,2,3],z[3,4,1,2]==0,z[2,4,1,3]==0,z[2,3,1,4]==0,z[1,4,2,3]==0,z[1,3,2,4]==0,z[1,2,3,4]==0};
(* rename tensor from z to pp *)
ConstraintsP = ConsTemp /.{z[var1_,var2_,var3_,var4_]-> pp[var1,var2,var3,var4]}

<p,u>=0 for all u in U  implies that <p, Id> = 0, so full trace p = 0 when p in perpU.
This gives one constraint on p

ConstraintsP = Append[ConstraintsP,
Sum[ PN[p,q,p,q] ,{p,1,4},{q,1,4}]==0
];

ConstraintsP //MatrixForm

Next get constraints for an arbitrary tensor to be in W

ConstraintsW={};
For[i=1, i≤4,i++,
For[j=1, j≤4,j++,
For[a=1, a≤4,a++,
For[b=1, b≤4,b++,
NewCon = Simplify[
Sum[Signature[{i,j,p,q}]PN[p,q,a,b],{p,1,4},{q,1,4}]
==  
-Sum[ Signature[{a,b,p,q}] PN[p,q,i,j] ,{p,1,4},{q,1,4}]
,
ConstraintsW];
If[NewCon==True,,,ConstraintsW= Append[ConstraintsW, NewCon];];
]
]
]
]
ConstraintsW//MatrixForm

If a tensor satisfies the above conditions, then the tensor is in W.

Check if these constraints are satisfied; That is, does p belong to W?

For[temp=1, temp≤Length[ConstraintsW], temp++,
Print[Simplify[ConstraintsW[[temp]], ConstraintsP]];
]