A simple test with a little over 1M values
Data
CREATE TABLE dbo.FOO([A] int , [B] int,[C] int, [D] int, [E] int);
INSERT INTO dbo.FOO([A] , [B] ,[C] , [D] , [E] )
VALUES(1,1,1,1,1);
GO 1000
INSERT INTO dbo.FOO
SELECT * FROM dbo.FOO;
GO 10
INSERT INTO dbo.FOO([A] , [B] ,[C] , [D] , [E] )
VALUES(1,2,1,1,1); --one matching record
This dataset is not a real world dataset, as aside from one record, all the other records are the same.
Amount of rows
select COUNT(*) from dbo.FOO
(No column name)
1024001
Query
Select A, B, C, D, E from dbo.FOO where A = 1 and B = 2;
No key lookup
Which is normal as this index is perfect considering the query and the dataset.
key column <> included column
The main difference between the key columns and included columns is that
these key columns are ordered [A] --> [B] (B-Tree) and the other columns [C], [D], [E] are not ordered (leaf level).
As a result seeking only on [A] is possible, seeking on [AB] is possible, but seeking only on [B] will create a residual predicate if the index is used.
Additionally
Example of a key lookup happening as a result of a different query
create Nonclustered index IX_Foo_2 on dbo.FOO ([B]) include ([C], [D], [E]);
Select A, B, C, D, E from dbo.FOO where B = 2;
A key lookup to get [A] happens, but it is not very expensive (one row).