Uploading Assets w/ Immediate Save?
So, thanks to @carlcs for verifying it was my setup…

turns out I had set the asset's Default Upload Location to include the slug (i.e. /photography/{slug}) and restricted uploads to that folder. This way images would end up in a folder whose name matched the entry slug, making it easier to clean out unused assets from time-to-time.

But that approach was the source of the problem. Once I removed {slug} from the default upload location it all worked as expected, the caption field appeared immediately after adding the asset.

Of course, in retrospect this makes total sense — there's no {slug} until you save the entry.