I believe broadcasting for addition is not supported. But there is a simple hack of repeating along some axis by using y.repeat(1, x.shape[1], x.shape[2])
from time import time

x = torch.ones(512, 16, 16)
y = torch.ones(512, 1, 1)

z = x + y

repeat_total_time = 0.0
add_total_time = 0.0
for _ in range(1000):
  qx = torch.quantize_per_tensor(x, 1.0, 0, torch.qint8)
  qy = torch.quantize_per_tensor(y, 1.0, 0, torch.qint8)
  
  start_time = time()
  qy = qy.repeat(1, qx.shape[1], qx.shape[2]).contiguous()
  repeat_total_time += time() - start_time

  start_time = time()
  qz = torch.ops.quantized.add(qx, qy, 1.0, 0)
  add_total_time += time() - start_time


print(f'Time to repeat: {repeat_total_time * 1000:.2f} ms')
print(f'Time to add: {add_total_time * 1000:.2f} ms')
print(f'Overhead: {(repeat_total_time + add_total_time) / add_total_time:.2f}x')

# Time to repeat: 27.84 ms
# Time to add: 73.29 ms
# Overhead: 1.38x

In your code, you would need to make this change:
    def forward(self, gamma, x_normalized, beta):
        # ...
        result1 = self.add_gamma_functional.add_scalar(gamma, 1)
        result2 = self.mul_gamma_with_norm.mul(result1, x_normalized)
        if result2.shape != beta.shape:
             result2 = result2.repeat(1, beta.shape[1], beta.shape[2]).contiguous()
        result3 = self.add_with_beta.add(result2, beta)
        result3 = self.dequant(result3)
        
        return result3

P.S. You might skip the contiguous – I think repeat result is contiguous, but I am not 100% sure