You don't need to do it that way.
interface StateInterface { val variationTypes: List<VariationType> get() = emptyList() } object EMPTY : StateInterface
Would work fine, but the author decided that they wanted the usage to read StateInterface.EMPTY and not just EMPTY.
One advantage or reason for choosing this way is that EMPTY appears in the code completion after typing StateInterface. making it easier to find.

Another readability advantage is that anyone who references StateInterface.EMPTY does not need an additional import line which they would if it wasn't a nested object.
import com.example.StateInterface val x = StateInterface.EMPTY
This bit open val stateInterface: StateInterface = StateInterface.EMPTY is a property on an object. It's open so descendant implementations can override it. If they do not, StateInterface.EMPTY will be the value of this property.