I've diagnosed it:
In the .smodel json, each dataset has a "schemaName" property. Also, each table in the dataset has a "schemaName" property.
When you load data or add new tables to your model, it uses table.schemaName.
But Refresh Schema uses datasets.schemaName.
When schemaName is the same for both, everything works fine. But if they differ (e.g. if a single datasource has tables from two different schemas), then Refresh Schema fails (unless the table also exists in the other schema).
Question for Sisense: Presumably this is a bug. Refresh Schema should use table.schemaName, not dataset.schemaName. Are you aware? Has it been fixed in later versions (I found it on 23.9)?