Now, It can be done using REST calls with help of Tooling API.
The above given solutions works perfectly using Apex Metadata Service (https://andyinthecloud.com/2013/10/27/introduction-to-calling-the-metadata-api-from-apex/); but it requires to import all code for even a small requirement. After, release of Tooling API, I find it lifesaver for such implementation without importing and managing too much code. We just need to make a callout using Tooling API.
Full detailed article is here: https://sfdcian.com/update-picklist-value-and-add-it-in-record-type-using-apex-salesforce/
PATCH
/services/data/v41.0/tooling/sobjects/CustomField/00N540000071QJG
Set metadata as body
{"Metadata" : {
"businessOwnerGroup" : null,
"businessOwnerUser" : null,
"businessStatus" : null,
"caseSensitive" : null,
"complianceGroup" : null,
"customDataType" : null,
"defaultValue" : null,
"deleteConstraint" : null,
"deprecated" : null,
"description" : null,
"displayFormat" : null,
"displayLocationInDecimal" : null,
"encryptionScheme" : null,
"escapeMarkup" : null,
"externalDeveloperName" : null,
"externalId" : false,
"formula" : null,
"formulaTreatBlanksAs" : null,
"inlineHelpText" : null,
"isAIPredictionField" : null,
"isConvertLeadDisabled" : null,
"isFilteringDisabled" : null,
"isNameField" : null,
"isSortingDisabled" : null,
"label" : "Community (Region)",
"length" : null,
"lookupFilter" : null,
"maskChar" : null,
"maskType" : null,
"metadataRelationshipControllingField" : null,
"populateExistingRows" : null,
"precision" : null,
"readOnlyProxy" : null,
"referenceTargetField" : null,
"referenceTo" : null,
"relationshipLabel" : null,
"relationshipName" : null,
"relationshipOrder" : null,
"reparentableMasterDetail" : null,
"required" : false,
"restrictedAdminField" : null,
"scale" : null,
"securityClassification" : null,
"startingNumber" : null,
"stripMarkup" : null,
"summarizedField" : null,
"summaryFilterItems" : null,
"summaryForeignKey" : null,
"summaryOperation" : null,
"trackFeedHistory" : false,
"trackHistory" : false,
"trackTrending" : null,
"translateData" : null,
"type" : "Picklist",
"unique" : null,
"urls" : null,
"valueSet" : {
"controllingField" : null,
"restricted" : null,
"valueSetDefinition" : {
"sorted" : false,
"value" : [ {
"color" : null,
"default" : false,
"description" : null,
"isActive" : null,
"label" : "Canada",
"urls" : null,
"valueName" : "Canada"
}, {
"color" : null,
"default" : false,
"description" : null,
"isActive" : null,
"label" : "US",
"urls" : null,
"valueName" : "US"
},
{
"color" : null,
"default" : false,
"description" : null,
"isActive" : null,
"label" : "UKk",
"urls" : null,
"valueName" : "UK"
}
]
},
"valueSetName" : null,
"valueSettings" : null
},
"visibleLines" : null,
"writeRequiresMasterRead" : null
},
"FullName" : "Case.Community_Group__c"
}
Here is JSON Body that has to be sent as request body in this callout: https://github.com/ayub-ansari/Create-Picklist-Field-Using-Apex/blob/master/FirstHTTPRequestToUpdatePicklistField