Вы можете предварительно распределить и использовать широковещательную рассылку, но это не сильно сэкономит (я бы ожидал, что пиковое использование памяти уменьшится примерно на четверть):
arr1 = np.arange(32*512).reshape(32, 512)
arr2 = np.arange(512).reshape(1, 512)
out = np.empty((32, 1024), arr1.dtype)
out[:, :512] = arr1
out[:, 512:] = arr2
out
#array([[ 0, 1, 2, ..., 509, 510, 511],
# [ 512, 513, 514, ..., 509, 510, 511],
# [ 1024, 1025, 1026, ..., 509, 510, 511],
# ...,
# [14848, 14849, 14850, ..., 509, 510, 511],
# [15360, 15361, 15362, ..., 509, 510, 511],
# [15872, 15873, 15874, ..., 509, 510, 511]])