It would seem that your tables lack any way to record which years that a member was active and which that they were not. You'd need some method to list the years for which the member was active. The simplest method for that would be to add a related table linked to members by your member iD field with a number for recording the year that the member was active.
When you first create a new member record, a script could also create a new record in this "history" table with the current year. When you click a button or run a script to update a member's status, that process would also need to create a new record n the history table with a new year recorded in that number field.
Just thought of another option. You could add a status field to donations and it could look up (copy) the member's current status. That would record the member's status at the time that they made the donation.
I considered the second solution earlier, but it doesn't take care of the number of active members that there are. How would I be able to do your first option, and have the year update automatically in the related record? So if a member was active in 2012, 2013, and 2014, nothing would have to be done to automatically put it in. This seems like the best solution to me.
Put an "update status" button on your membership layout that does this:
Set Variable [$Year ; Year ( Get ( CurrentDate ) ) ]
If [ IsEmpty ( FilterValues ( List ( History::Year ) ; $Year ) ) // check to see if status for current year has been logged already ]
Set variable [ $MemberID ; Membership::Member Unique ID ]
Go To Layout [ "History" (History)]
Set Field [History::Year ; $Year ]
Set Field [History::MemberID ; $MemberID ]
Go to Layout [original layout]
And a variation of the expression in the IF function could be used in a conditional format expression to show that the member is or is not currently active.