There is about tenfold difference between actual and estimated number of rows coming from Index Seek operator on IX_locations index. It could be that the stats are stale, or that the distribution of data is skewed. But it's just part of the problem.
It would be interesting to know a bit more about Thing table. Taking into account that when you query Things table separately, filtering on startTime column, it returns in sub-second, my guess is that startTime is much more selective and also that this query uses some index on startTime column.
Try selecting from Things into a #temp table and join this to Locations.
Also, select from Locations into #temp table and join Things. Check the execution plan, what's the operator on Things table? If it's seek again, then my recommendation is to select from both Things and Locations into #temp tables first and then join them.