Metafunctions shall not only be used by a user to determine a type of a function or data structure. They are as well defining the types of data structures, i.e. if you change the return type of a metafunction you can change the behaviour and the types of data structures in the library. This is a bit different to the STL, where types are defined in a trait structure - an additional template argument.
Changing the return type of a metafunction is only possible for a type which is more special than the default type (it was already specialized for). Of course there is a SAValue specialization done for all Index classes of the form Index<TText, TSpec> which returns the SAValue<TText>::Type. To be more special you can either specialize for TText or TSpec. The example in my last mail did the latter. You will find the list of metafunctions specialized for a certain type under "Metafunction" on its documentation page.
Yes, the specialization needs to be done in the seqan namespace. SAValue is not an argument of the Index as there are many more metafunctions (see Fibre, DefaultIndexCreator, ...) would blow the interface. We intentionally left a single extra argument (TSpec) open for enhancements. If you want to create a specialized index you can define your own struct (MyIndex in the example) and give it as TSpec. You can then change the behaviour of your index by specializing only the types/tags you want to change like SAValue, Fibre, ... Just like you would do it for functions in OOP.