You could try sticking your y bits in a list and then use torch.cat.
So something like this (but I might have gotten something wrong).
x[:, None] is the same as x.unsqueeze(1), that is my taste preference here, you might have different ones.
class MyFancyModel(nn.Module):
    def __init__(self) -> None:
        super().__init__()
        self.core = Core()

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        assert x.shape == (1, 2, 2)

        y = torch.empty(1, 4, 2)
        y_list = [x]

        x1, x2 = x[:, 0], x[:, 1]
        y1, y2 = x[:, 0], x[:, 1]
        y_new = x2 + (x2 - x1) * self.core(y1, y2)
        print(y_new.shape)
        y_list.append(y_new[:, None])

        x1, x2 = x[:, 1], y_new # ??
        y1, y2 = y2, y_new
        y_new = x2 + (x2 - x1) * self.core(y1, y2)
        y_list.append(y_new[:,None])
        y = torch.cat(y_list, 1)

        return y

Best regards
Thomas