I think I've found a solution, which is though not as convenient as direct indexing:
i, j = mask.nonzero(as_tuple = True)
x[i, j, :, :3] = y[i, j]
However, in situation that shape of the masked dimensions are unknown, an additional reshaping will be involved to squeeze the unknown dimensions in one, which still cause extra time and memory. So I still think that it is nonsense that mask and slice assignment cannot be used simultaneously.