I'm not sure there's any sense comparing the first two with the 3rd and 4th - they do different things.
sorted(a, key=lambda x:x[1], reverse=True)
Sorts the list of lists by the second element only, while...
sorted(b, key=lambda x:x[2], reverse=True)
Sorts the list of lists by the third element only, regardless of how the list was sorted before.
sorted(a, key=lambda x: (x[2],x[1]), reverse=True)
sorted(a, key=operator.itemgetter(2, 1), reverse=True)
Both of these methods sort the list by the third as well as the second element. Ties on the 3rd element are broken by the second, basically.
Performance
Small
100000 loops, best of 3: 3.62 µs per loop
100000 loops, best of 3: 2.9 µs per loop
The last method is faster simply because lambda functions are slower.
Medium (100K elements)
10 loops, best of 3: 60.7 ms per loop
10 loops, best of 3: 50.7 ms per loop
Large (3M elements)
1 loop, best of 3: 2.07 s per loop
1 loop, best of 3: 1.71 s per loop
It is important to understand that the theoretical time complexity of these methods are exactly the same - their order of growth is identical. The only difference here is the techniques you use, which can make minor differences in speed. It is also important to understand that if you're looking for high performance, Python isn't the language you should be working with.
timeitmodule and see which one runs the fastest for youkeyfunction doesn't do anything crazy. So, this is an empirical question, one which you have all the tools at your disposal to elucidate.