Not using the volume update API, no. According to the docs, userland must stream the entire volume size before the update is committed:
To update a volume, you first have to call the
UBI_IOCVOLUP ioctl of the corresponding UBI volume character device and pass it a pointer to a 64-bit value containing the length of the new volume contents in bytes. Then this amount of bytes has to be written to the volume character device. Once the last byte has been send to the character device, the update operation is finished. Schematically, the sequence is:
fd = open("/dev/my_volume");
ioctl(fd, UBI_IOCVOLUP, &image_size);
write(fd, buf, image_size);
include/mtd/ubi-user.h for more details. Bear in mind, the old contents of the volume is not preserved in case of an interrupted update. Also, you do not have to write all new data at one go.
So you could definitely do a delta update, but you'd need to create a utility that streams the unchanged parts from another source, because once you start the volume update operation, you have to write the whole thing. Or, if you don't feel like using the API, you could create the new image in temporary storage, and
ubiupdatevol with that.
In practice, by the way, it's possible that UBI could elide the writes to the unchanged parts. But you still have to send them.