I think the alist conversion procedures are important since they allow bags to be defined in program text and serialized with read and write.
I guess the pertinent question is: does ((a . 1) (1 . 2)) mean (1) "1 copy of a, and then *an additional* 2 copies of a"; or (2) "currently the count of a's is 1; in the past the count for a was 2." The semantics of assoc make it seem that conventionally, (2) is how alists with duplicate entries are interpreted. Which I think is consistent with your first definition for how alist->bag and alist->bag! should work.
Kevin Wortman