The GattCharacteristic initLen parameter is randomly named minLen too. If you follow the code all the way through it actually does two things - it is the initial length (not minimum), and it determines whether the characteristic is variable length or not.
The characteristic for nRF51822 code is only variable length if initLen != maxLen. This is really stupid because you might want the initial length to equal the maximum length but still have variable length. It also isn't documented anywhere.
I suggest the following solution:
Add extra constructors with an extra parameter: bool variableLength.
Name initLen to be initLen everywhere consistently (and not minLen).
(This is a duplicate of https://github.com/ARMmbed/ble/issues/93 as it affects both projects.)
See: https://devzone.nordicsemi.com/question/34390/no-ble_gatt_hvx_notification-under-20-bytes/?answer=55637#post-id-55637
Basically there are two problems:
I suggest the following solution: