I think that it may have done that at one point in the past. I don't remember the reasons for changing that though, but it could have something to do with the persistance of the ALLEGRO_SAMPLE_INSTANCE pointer.
Originally ALLEGRO_SAMPLE was ALLEGRO_SAMPLE_DATA and ALLEGRO_SAMPLE_INSTANCE was ALLEGRO_SAMPLE. I switched it around to the way it was now in order to make the "simple" mode the default. (i.e., To work more like Allegro 4.)
I'd have to look at the source to refresh myself, but I'm thinking that if the actual instance were returned, you could completely mess up future al_play_sample calls if you did things like destroyed that sample instance.
Edit: It seems like the advantage of the current setup is that you never have to al_destroy_sample_instance() when doing an al_play_sample(). When it's done playing, it's lost, and it can be reused.
I think we could introduce an ALLEGRO_SAMPLE_ID to ALLEGRO_SAMPLE_INSTANCE function if:
While ALLEGRO_SAMPLE_ID would not be strictly necessary if it were impossible to destroy the reserved instances, I think it would still be useful so you know whether or not you're dealing with the same instance as you think you are.