Hello,
I have no answer but I made a similar observation today.
I compared tensor indexing vs masked_scatter:
x[condition] = y[condition]
# VS
x.masked_scatter_(condition.view(-1, 1), y)

and indeed masked_scatter is much slower.
Additionally, I found the solution using tensor indexing to be faster than torch.where by about 20%, and to be more readable.

On my machine, I get:
<torch.utils.benchmark.utils.common.Measurement object at 0x7f7845fc4b70>
x.masked_scatter_(condition.view(-1,1), y)
  28.40 ms
  1 measurement, 100 runs , 1 thread

<torch.utils.benchmark.utils.common.Measurement object at 0x7f7845fc4ac8>
torch.where(condition.view(-1,1), x, y)
  6.19 ms
  1 measurement, 100 runs , 1 thread

<torch.utils.benchmark.utils.common.Measurement object at 0x7f7845fc4828>
x[condition] = y[condition]
  4.79 ms
  1 measurement, 100 runs , 1 thread