Если вы дизассемблируете (например, dotPeek) Object, то
public virtual bool Equals(Object obj)
описывается как:
// Returns a boolean indicating if the passed in object obj is
// Equal to this. Equality is defined as object equality for reference
// types and bitwise equality for value types using a loader trick to
// replace Equals with EqualsValue for value types).
//
Итак, это зависит от типа.
Например:
Object o1 = "vvv";
Object o2 = "vvv";
bool b = o1.Equals(o2);
o1 = 555;
o2 = 555;
b = o1.Equals(o2);
o1 = new List<int> { 1, 2, 3 };
o2 = new List<int> { 1, 2, 3 };
b = o1.Equals(o2);
Первый раз b равен true (выполняется одинаково для типов значений), второй раз b равен true (выполняется равным для типов значений), третий раз b равен false (равенство выполняется для ссылочных типов).