I ended up running into another bug while testing. Curtin updates the initrd a second time on ARM but wasn't mounting /dev which caused update-initramfs to fail. Instead of calling util.subp update_initramfs now uses util.ChrootableTarget which automatically mounts /dev, /sys, and /proc. After making that change I was able to deploy Xenial on an ARM host.
I ended up running into another bug while testing. Curtin updates the initrd a second time on ARM but wasn't mounting /dev which caused update-initramfs to fail. Instead of calling util.subp update_initramfs now uses util.Chrootable Target which automatically mounts /dev, /sys, and /proc. After making that change I was able to deploy Xenial on an ARM host.