If you have a 48 core box and 4 cores are allocated to SND, you have 44 cores in the 'CoreXL pool' that the fwk process for VSs can use. Each VS will spawn X fwk threads, where X is your CXL/VS configuration. These are user mode threads, so the OS process scheduler will grant them CPU time on any one of the 44 cores in the CoreXL pool when they need some, they will dance around and utilise whichever core is available at the moment they need CPU time, they are not affined to any specific CPU core [yes you can manually affine them, no you shouldn't as it's overcomplicating things unnecessarily]. This system works well, a VS can be loaded to destruction using 100% of X cores with its fwk threads with the other VSs happily dancing on the other cores while the loaded VS crashes and restarts itself, with no impact to other VSs.
As such it is safe to 'oversubscribe' somewhat, as the threads will coexist nicely on the available CPU cores. HCP will start giving you warnings when you have 2x CXL/VS than available cores, so that's a good limit to stay under - and consider high availability when you are sharing the VSs across two cluster members. You need a single member to be able to service the full load of all VSs at peak time if you have a 2-node cluster.
Also, use R81.20 and dynamic balancing if this is on CP appliances. This will dynamically adjust your allocation between SND and CXL pool, but does not dynamically adjust CXL/VS.