If the node therefore cannot fully validate those blocks, can it safely treat the outputs created by those blocks as valid UTXOs and progressively construct a partial UTXO set from them?
You would have to trust the block where you started the download (let's call it block X) and the current block where the download ended (let's call it block Y), i.e. the chain tip you downloaded. Trusting block Y of course implies trusting block X too and all intermediate blocks too.
In practical terms this could be possible, say you lookup the blockhash of block X and Y manually in several block explorers, on two consecutive days, and then mark the block as trustworthy and only then start using the client -> the probability of being gamed would be negligible. This would be afaik more safe than the assumeUTXO method Core uses for background validation, where you use only one source for an UTXO snapshot, and this source could be not only malicious, but also have been hacked or manipulated in some way. You could alternatively use a method like assumeUTXO and compare the snapshots from different sources.
(Of course, assumeUTXO is different from your idea: the whole blockchain is validated, but in the background while the node is already "somewhat" usable, so any manipulation would be detected quite fastly.)
But without this trust assumption, your idea is impossible.
Is it technically feasible for a Bitcoin node to construct a trustworthy partial UTXO set using only the most recent (N) blocks, without first obtaining a validated UTXO state at the beginning of the retained window?
LoyceV is correct from my point of view if you don't trust any block, but if you trust the blocks X and Y, you could construct such a partial UTXO set. The problem however would be that this set would be very small if N isn't a large part of the blockchain.
You could only integrate UTXOs into this set which are present completely in one of the N blocks you downloaded, i.e. block X and after. And for the blocks after Y, you cannot assume the transactions with UTXOs which are not in the blocks N are valid. You can of course "legalize" a new stretch of the chain after some time if you check the blockhashes again.
The advantage over SPV clients would be mainly privacy, not so much security. And an approach close to the Monero client "Feather" -- a light client where you download all recent blocks where transactions of your wallet could be located -- would yield the same advantages. (Edit: Ginger/Wasabi afaik do not achieve such a high level of privacy because the filtered blocks could still be processed by chain analysis.)
If all inputs of a newly received transaction are present in such a partial UTXO set, would that be sufficient for the node to independently validate that transaction, or would the incomplete validation history of the partial UTXO set prevent this?
Again only if you trust the blocks X and Y.
If this approach is technically possible, why is recent-block-based partial UTXO construction not commonly used by lightweight Bitcoin nodes today? What are the main technical or security limitations?
Apart from the trust assumption, the small partial UTXO set would limit the usability of that node severely OR require a high number of blocks (e.g. a third of the blockchain) to be validated, and as I wrote before, it would only be safe if you check the block X / Y at least twice in time, so your node would not immediately be fully usable. assumeUTXO looks like a way better alternative.