Here is the output of 4 variations:
var_dump($config['installedpackages']['miniupnpd']);
string(0) ""
var_dump(isset($config['installedpackages']['miniupnpd']));
bool(false)
var_dump($config['installedpackages']);
string(0) ""
var_dump(isset($config['installedpackages']));
bool(true)
$config['installedpackages'] seems to really be set to the empty string.
$config['installedpackages']['miniupnpd'] gets interpreted as $config['installedpackages'][0] - PHP thinks that the string key needs to be a numeric string index in this case and makes it 0. When the string is blank, then each offset returns blank, I can even feed in $config['installedpackages'][999] and it tells me it is a blank string. This behaviour happens when using what you intend to be an array key, but the actual variable is a string.
But when you check with isset, it really looks at the string keys you supply and realises that you must mean that these should be array keys, not string offsets. So it returns true or false based on the existence of the array entries.
Just for fun, PHP does not think any of these are arrays:
var_dump(is_array($config['installedpackages']['miniupnpd']));
bool(false)
var_dump(is_array($config['installedpackages']));
bool(false)
You could also test with is_array($config['installedpackages']['miniupnpd']) - because the following code is only to be executed if this is an array.