Wrt. terminology, by "initialisation", we are talking about simply setting the initial value, and not using the term as defined in the C or C++ standards.
Why would someone initialise global variables at any other point in the code other than declaration?
On resource-constrained systems like microcontrollers, initialising global variables in C and C++ is done as part of the system bootup, and currently involves either copying the (nonzero) data from ROM/Flash, or executing a function (implemented by the compiler) to initialize the object (in C++).
In many cases, the objects can be initialized more efficiently using dedicated expressions. For example, you might have an array where all entries are initialized to the same pattern. So, instead of using the standard language-provided facilities to set the initial value, you sometimes use a separate function to do so, to save ROM/Flash.
There is also a much more complicated situation: reboots due to watchdog et cetera. If the device gets rebooted, typically the contents of the RAM are retained. However, since it can be difficult to tell why a reboot occurred in the first place, the contents may not be valid (for example, because they were garbled due to a programming error).
If you use a separate function to set their initial values, it is possible for that function to check e.g. a CRC of the value (which is updated whenever the variable is updated), and determine whether the variable is still valid, and not rewrite it with the bootup default. Sometimes this can let the system continue after crash with minimal user-visible effects, but more often that kind of information is used to log the state at which the crash occurred. There isn't enough resources for the runtime to do that automatically (the closest equivalent is the core dumps on POSIXy systems when running an application or service that crashes, generating a file that describes the state of the process at the point it crashed), but if there is a global state variable or a set of global state variables, detecting a crash while setting their initial values (and perhaps populating "crash log" shadow state variables?) is another reason to do variable and object initialisation separately.
None of the reasons I can think of extend to C or C++ in general, or in hosted environments (with full standard libraries available, say running under an OS). This all assumes an embedded and/or resource-constrained environment, and the technical needs of such; and in a very real sense, really is independent of the programming language used.