Create a single Appointment BO and use the recurrence field to set an annual recurrence (controlled by RecRule attribute).
I have a Contact BO that has a field DateOfBirth and off of that I create an owns single relationship to an Appointment Group BO called DateOfBirth, when you add the Date of Birth on the Contact BO a Rule then either creates the DateOfBirth and sets it's ownership to the Contact and sets the RecRule to be:
DateOfBirth.RecRule='FREQ=YEARLY;BYMONTH='+MONTH(Contact.DateOfBirth)+';BYMONTHDAY='+DAY_OF_MONTH(Contact.DateOfBirth)+';WKST=SU'
Or if there is already a Date of Birth (and consequently a DateOfBirth Appointment BO),
IF Contact.osDateOfBirth IS DEFINED AND Contact.DateOfBirth WAS CHANGED THEN Contact.osDateOfBirth.StartTime=Contact.DateOfBirth Contact.osDateOfBirth.EndTime=Contact.DateOfBirth
This way you end up with one appointment record so that when you accidentally put the wrong date in you can correct it once without reprocessing.
I use Appointment objects extensively and create multiple Appointment BOs for the various different types of date I want to record. I had previously worked with a generic Appointment BO that became overly cumbersome to manage it depending on what type of date it was recording as it required additional fields in the Appointment record and more redundancy. It also makes it easier to manage Forms as I can create different Forms for each Appointment BO and not have to create code to display the correct form when I have multiple Appointment BO. But that is my personal preference, I prefer to not generate code where I can offload it to AIM.
From memory the RecRule only sets one Appointment BO instance.