To build on what @niteshm said - the reason <catalog>.information_schema.column_masks came back empty for you is almost certainly not sync delay or permissions, it's the query scope. Per-catalog information_schema only reflects masks defined within that catalog's own metastore context. Query it from the SYSTEM catalog instead:
SELECT * FROM system.information_schema.column_masks WHERE catalog_name = '<your_catalog>'
That's the documented, cross-catalog view and it's the one that's actually reliable for scanning at scale.
One more thing worth checking if that still comes back empty: are your masks applied via ABAC policies (governed tags, catalog/schema-level policies that apply automatically) rather than manual UDF assignment directly on the column? Databricks has two distinct mechanisms now - manual column mask UDFs bound per-column, and newer ABAC policies that apply based on tags across whole catalogs/schemas. column_masks reflects the manual per-column bindings; if your masking is coming from an ABAC policy, it won't show up there at all, since it's not a per-column assignment in the same sense. For that case you'd want to enumerate policies directly - DESCRIBE POLICY on a specific table/policy shows the details, and it's worth checking your workspace's ABAC policies documentation for how to list all active policies rather than assuming column_masks is exhaustive.
So the practical order I'd check in: query system.information_schema.column_masks (not the catalog-scoped one) first, and if it's still empty despite known masking, that's a strong signal you're on ABAC-based masking rather than direct UDF assignment and need the policy-listing path instead.