Chapters 8-11 go through the ways you can do this.
The first thing to match is the signature. As you said, it is easy to differentiate chips by signature, but when you have two chips with the same signature, you have to resort to other methods to select between them.
The next method is to use match by fuse or lockbits. This works when you have different fuse values. Hopefully the two AVR's already have different values because they need to, but often you can set a fuse bit or two that does not matter to your application and then use that to identify them uniquely.
The next method is the multiple match select (MMS) feature. If you create a configuration where more than one microcontroller configuration matches - for example, if you have two uC entries that are for the atmega328, then when it detects this, and blink twice and wait for button pressing. If you tap the button, it will switch to 1 and blink 1. Another tap will go back to 2 blinks. HOLDING the button will program the selected entry. It is important to understand that 1 represents the first microcontroller entry that matched, 2 is the 2nd that matched, and so on. I do this with a project - I have a basic firmware that is "1" and a deluxe that is "2". I connect, select the one I want, and program it. This feature is best for someone who understands how to use it which is likely not the end user.
The next method is multiple programmers. You can have a programmer with one configuration on it, and a second one with another configuration. You can color code them or label them and use the "blue" one for one testing and the "red" one for final programming.
Chapter 11 even has a very advanced configuration example that counts on using MMS at first (when programmed in house and the user knows how to do it), but then it sets fuses in such a way that once programmed, it will be fully automatic for subsequent uses (by the end user, etc.)
I hope this helps!