T-SQL Gurus, I need help optimising these queries for performance
For the first query, this version eliminates a CI seek and a TOP N Sort, and cuts the reads against dbo.Bids in half. It performs more reads overall, but those are caused by a worktable, not an actual table. I believe this gives your desired results, but without more sample data, I can't be sure that it matches your requirements.

SELECT TOP (1) bid, msisdn
  FROM dbo.Bids
  WHERE bid &gt;= 0.01 AND auctionid = @auctionid
  ORDER BY COUNT(*) OVER (PARTITION BY bid), bid, lineid;


For your second query, this gets rid of a CI seek, a sort, a nested loop join, and a few other operators:

;WITH x AS 
(
  SELECT msisdn, MinBid = bid, lineid, tally = COUNT(*) OVER (PARTITION BY bid)
  FROM dbo.Bids AS t WHERE auctionid = @auctionid AND bid &gt;= 0.01
),
y AS 
(
  SELECT TOP (1) WITH TIES msisdn, MinBid, lineid 
  FROM x ORDER BY tally
)
SELECT msisdn, MinBid, ranking = ROW_NUMBER() OVER (ORDER BY MinBid, lineid) 
FROM y ORDER BY ranking;


For the third query, this gets rid of two sorts, a CI seek, and cuts the table reads in half.

;WITH x AS 
(
  SELECT msisdn, MinBid = bid, lineid, tally = COUNT(*) OVER (PARTITION BY bid)
  FROM dbo.Bids AS t WHERE auctionid = @auctionid AND bid &gt;= 0.01
),
y AS 
(
  SELECT TOP (1) WITH TIES msisdn, MinBid, lineid 
  FROM x ORDER BY tally
),
z AS 
(
  SELECT msisdn, MinBid, ranking = ROW_NUMBER() OVER (ORDER BY MinBid, lineid)
  FROM y
)
SELECT TOP (1) msisdn, MinBid, ranking FROM z WHERE msisdn = @msisdn ORDER BY ranking;


For all of these, you'll have to test whether this leads to better or worse overall performance in your environment. I only tested (both accuracy and plan shape / duration) using your limited sample data. Things could go askew depending on data distribution, cardinality estimates, any other indexes, etc. etc.