Here's my solution based on the syntax of Rojo, it works for most syntaxes of Part (maybe all). All dimensions corresponding to the indices where the test function and All are present are considered in the data selection. The value argument can either have the dimension of the x list or of the list corresponding to non-integer positions.
Warning
The code works by adding an UpValue to Part for the value assignment case, and an UpValue to Function for retrieving values satisfying a condition. These are non local changes meant to be experimental, I haven't tested this function extensively, so please use with caution.
If you want to use the functions below in a safe way, see the answer to Alternative to overloading Set.
First some usage example
x=Table[2,{3},{2},{3},{2}];
x[[All,1,EvenQ[#] &,All]]=6
x
y=x[[All,1,All,All]]*2
x[[All,1,EvenQ[#] &,All]]=y
x
x[[1;;,1,EvenQ[#] &,All]]=6
x[[1 ;;, 1, All, All]]
x[[1;;,1,EvenQ[#] &,All]]
(*The parts of another symbol than x can be accessed using Sequence@@#2
as the condition is applied in a MapIndexed*)
x[[1;;,1,EvenQ[y[[Sequence @@ #2]]]&,All]]=6
The code
Unprotect[Part];
UpValues[Part]={};
Part/:Set[Part[x_,leftIndices:((_Integer|All|_List|_Span)...),cond_Function(*|cond_Symbol/;!(ListQ[cond]||cond===All)*),rightIndices:((_Integer|All|_List|_Span)...)],value_]:=
part[x,{leftIndices},cond,{rightIndices},value];
Protect[Part];
Unprotect[Function];
UpValues[Function]={};
Function/:Part[x_,leftIndices:((_Integer|All|_List|_Span)...),cond_Function(*|cond_Symbol/;!(ListQ[cond]||cond===All)*),rightIndices:((_Integer|All|_List|_Span)...)]:=
part[x,{leftIndices},cond,{rightIndices}];
Protect[Function];
SetAttributes[part,HoldFirst];
part[x_,{leftIndices:((_Integer|All|_List|_Span)...)},cond_Function(*|cond_Symbol/;!(ListQ[cond]||cond===All)*),{rightIndices:((_Integer|All|_List|_Span)...)},value_:None]:=
Module[{xDimensions,indexSpanRange,allIndices,matchedSubPositions,matchedPositions,valuesExtracted,nonIntegerPositions, valuesReturned},
allIndices={leftIndices,Sequence@@ConstantArray[All,Length@Dimensions@x-Length@{leftIndices}-Length@{rightIndices}],rightIndices};
matchedSubPositions=Position[MapIndexed[cond,x[[Sequence@@allIndices]],{-1}],True,{-1}];
nonIntegerPositions=Position[allIndices/.{_Span->All},All|_List] // Flatten;
If[matchedSubPositions=!={}&&(Length[{leftIndices}]>0||Length[{rightIndices}]>0),
matchedPositions=ConstantArray[allIndices /.{_Span->0,All->0},Length@matchedSubPositions];
If[Position[allIndices,_List|_Span]=!={},
xDimensions=Dimensions[x];
MapIndexed[
(
Switch[allIndices[[#1]],
_List,
matchedSubPositions[[All,First@#2]]=matchedSubPositions[[All,First@#2]]/.Thread[(Range@Length@allIndices[[#1]])->allIndices[[#1]]];,
_Span,
indexSpanRange=Range@@(allIndices[[#1]]/.{All->xDimensions[[#1]],i_Integer?Negative:>xDimensions[[#1]]+i+1});
matchedSubPositions[[All,First@#2]]=matchedSubPositions[[All,First@#2]]/.Thread[(Range@Length@indexSpanRange)->indexSpanRange];
]
)&
,
nonIntegerPositions
];
];
matchedPositions[[All,nonIntegerPositions]]=matchedSubPositions;
,
matchedPositions=matchedSubPositions;
];
(*assignment*)
If[value =!= None && matchedPositions=!={},
If[NumericQ[value],
x=ReplacePart[x,matchedPositions->value];
,
If[Length@Dimensions@value==Length@nonIntegerPositions,
valuesExtracted=Extract[value,matchedSubPositions];
,
valuesExtracted=Extract[value,matchedPositions];
];
x=ReplacePart[x,Thread[matchedPositions->valuesExtracted]];
];
];
(*returned values*)
If[matchedPositions=!={},
valuesExtracted=Extract[x,matchedPositions];
valuesReturned =
ReplacePart[
ConstantArray[{},xDimensions[[nonIntegerPositions]]]
,
Thread[matchedSubPositions->valuesExtracted]
];
valuesReturned
,
{}
]
];