If performance is key, then I think an additional fact table for latest contact is just fine. After all, that's what the data mart is for--pre-aggregated data for fast performance. It's not quite an accumulating snapshot, which typically has several foreign keys to the time dimension in order to measure the time span between events.
It seems like 200k+ is not a terribly large number, so you may be able to achieve the same thing in a simpler manner with a view. I may have the columns wrong, but something like this will be very fast with the indexing in place:
SELECT ContactTypeKey, MAX(ContactTs)
FROM factContact
GROUP BY ContactTypeKey
Then that view can be used to join back to the fact table by the ContactTypeKey and ContactTs to return the ContactResult. This assumes that your table name is factContact, and that ContactTs determines the most recent, etc. In reality, you may need to join to the date dimension to calculate most recent, and you may need to group by more dimensions or maybe join to the contactType dimension and group by ContactClass. I've used this strategy on occasion, but it's hard to say how well it would apply here.