Why? what problem are you trying to solve?
Did you know that you can pass datasets through datasets?
datasets = [a, b, c,]
meta = tf.data.Dataset.from_tensor_slices(datasets)
merged = meta.interleave(lambda x:x)

If you did that with your image_ds, text_ds then you’d have a dataset that alternates between image and text paths… but why? A dataset needs to have a single spec. So you can’t  load the files in each dataset, and then interleave those.
I can think of a few solutions, they just seem worse than the map before zip above:

.batch(2).map(read_files)
have both read_img and read_text return (image, text) pairs, where the first axis of text is length 0 for read_image and the first axis of image is zero for read_text.