Best way to store immutable/read-only copies of data for logging?
You could treat your reference tables as slowly changing dimensions and perform type 2 maintenance i.e. add a new reference row when any reference data changes.  Over time you may choose to horizontally partition your reference tables into "active" and "archive" parts, depending on the data churn you experience.  This can be achieved using using SQL Server's built-in partitioning functionality or a roll-your-own approach with two separate tables.  Your needs at the time will dictate which.

There is no good reason why your active OLTP table and your logging table should look the same.  They perform different roles and have different read and write requirements.  If the logging table needs to be wide and sparse then that's what it needs to be.  Create the objects to solve the problem you have.

And one last suggestion, which is defininetly from the "clutching at straws" bucket: define TASK_DONE (id int, reference_values xml).  Extract your pertinent values at the point in time and save them away.  This allows for changes in the reference data schema without having to bring existing log records up to the new schema.  That will make historical searching more complicated, of course.