OptSelectCount is the number of times the optimizer considered selecting the access method/index - e.g. during index selectivity it was selected - but wasn't used in final plan. UsedCount is the number of times the access method was selected/actually used. So, in your first example, with TableA, the PK was *actually* used about 850K times (if you delta the two UsedCount samples).
As you point out, it is most likely a covered query or perhaps a slight scan (e.g. a between on last column) in which only a few rows qualify - hence actual table accesses are less than index pages read (LIO).
A key thing to remember is that we are talking Index Access and Table Access specifically.......sooooo....an insert into a heap table (no clustered index) will trigger a UsedCount on the TableAccesses (IndexID=0).
The other thing to remember is that APFReads can be either Logical or Physical (you can see this even in sp_sysmon). APFReads typically do point to a scan of some form - either table or range scan (index or table) as ASE knows it needs to prefetch the pages and simply issues the APF calls. Whether in cache or not, they will increment the APFReads in monOpenObjectActivity. If not in cache, they will increment APFReads in monDeviceIO.