To me, this idea stinks. Adding new columns requires a schema modification lock. This is a very serious lock and I would rather my users not have the ability to obtain it.
Why not? (Sure I can list out a bunch of theoretical reasons but...) Regardless if your users make a schema change or you as a developer make those same changes, then a schema modification lock will be required. Most use cases where end users have this access are in a limited world where they'd only be shooting themselves or their team in the foot. In a multi-tenant environment, there should be no crossover, and tenants should be separated anyway.
Further application design measures can be implemented to minimize the hurt from end users punching themselves in the face too, such as delayed execution of the schema changes (e.g. a scheduled queue to run the generated SQL off-hours) and limiting access to this ability to admin privileged users of the application.
Is there any property of sparse columns that makes allowing users to take such a serious lock not as terrible as it would be for other types of column?
Again, I don't believe so, and the solution should be an architectural solution. Aside from what I mentioned above other design choices that can mitigate the risk of this is either have a preset amount of columns of varying data types that individually get mapped when the end user needs a customized column, or have a separate table, e.g. ObjectNameExtended
where new columns are added dynamically by the users so that the schema modification lock only affects customizations and not the native application at least.
Also, as Erik Darling pointed out, Sparse columns have a set of limitations that can be pretty lame, such as preventing you from compressing any tables / indexes that they're part of:
Sparse columns are incompatible with data compression. Therefore sparse columns cannot be added to compressed tables, nor can any tables containing sparse columns be compressed.
Also, from a maintenance announcement on this network:
sparse columns feature prevents us from adding new non-null columns with a default value as an online, metadata-only change.