If I had to guess, I would say because query 1 pulls data from both tables. Queries 2 and 3 (at about the same time) pull data only for TabA.
One way to verify this is to run the following:
SET STATISTICS TIME ON SET STATISTICS IO ON
When i started
SELECT * FROM sys.objects
I saw the following results.
SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 104 ms. (242 row(s) affected) Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'sysschobjs'. Scan count 1, logical reads 10, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'syssingleobjrefs'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'syspalnames'. Scan count 1, logical reads 2, physical reads 1, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 866 ms.
You can see the number of scans, logical reads, and physical readings for each request. Of course, physical readings take much more time and are read from disk to cache. If all your reads are logical reads, your table is completely in the cache.
I would argue, if you look, you will see much more logical readings in TabB at request 1 than on 2 and 3.
EDIT:
Just out of curiosity, I did some tests and posted the results here .