Core component of SQL Server for storing, processing, and securing data
The DELETE doesn't wait at the table or page level. It takes IX on the table and IU/IX on pages, and those are compatible with Service A's IX locks. The wait is on the specific KEY, which is what your monitoring shows.
The locate phase uses locking reads, not row versions, even under RCSI. Versioning only affects the reads of plain SELECTs.
A scan takes a U lock on every row it reads before testing your predicate. Rows that don't qualify are released right away under READ COMMITTED. Rows that qualify are converted to X. So when the Clustered Index Scan reaches Service A's uncommitted key, it waits on the X lock even though that key isn’t in your IN list.
A seek only touches the keys in your list, so it never meets the uncommitted row. That's why FORCESEEK or a seek plan avoids the blocking.
This is intentional. The engine only evaluates predicates on rows it has locked, so a row can't change between being tested and being modified. SQL Server 2022 has no way to test the last committed version first and lock only matching rows.
SQL Server 2025 adds that capability as Lock After Qualification, part of optimized locking. It's off by default and enabled per database. It requires ADR, and RCSI is needed for its benefit. With it on, the scan tests rows against the last committed version and locks only the rows it will delete, so the uncommitted insert doesn’t block it.