OFFSET is a volatile function (recalculated every time) that can be used to give position of cell(s) by giving numerical column/row offsets, as well as changing the size of the cells.
INDIRECT needs a string reference built in order to be used, possibly leading to a need for concatenation. It can't be used for a reference on an external workbook. However, it's greatest strength, imo, would be that you can use if for an ABSOLUTE NO WAY THIS IS GONNA CHANGE referehce. I.e.,
=INDIRECT("A2")
will always refer to A2, regardless of the user inserting/deleting rows, moving things around. In some scenarios, this is a great benefit.
In the end, it really depends on your needs/use, but I usually go with OFFSET because I find it easier to use, and more versatile.