Since @Solspace responded clarifying the uses and limitations of the various calendar tags, it is now clear to me that it is not possible to access both event AND calendar custom fields within one calendar tag pair. My workaround, now, is to utilize stash, and first create an index of my calendar custom fields, that I can then access from within my {exp:calendar:cal}
tag loop, for each event I am displaying.
{exp:http_header content_type="application/json"}
[
{exp:stash:set_list name="calendar_data" parse_tags="yes"}
{exp:calendar:calendars}
{stash:my_calendar_id}{calendar_id}{/stash:my_calendar_id}
{stash:my_calendar_title}{title}{/stash:my_calendar_title}
{stash:my_calendar_color}{calendar_color}{/stash:my_calendar_color}
{stash:my_calendar_icon}{calendar_icon}{/stash:my_calendar_icon}
{/exp:calendar:calendars}
{/exp:stash:set_list}
{exp:calendar:cal
date_range_start="{get:start}"
date_range_end="{get:end}"
status="not closed"
show_months="999"
dynamic="no"
}
{if event_count != 1},{/if}
{exp:stash:get_list name="calendar_data" match="#^{event_calendar_id}$#" against="my_calendar_id"}
{
"id": "{event_id}-{event_count}",
"calendar": "{event_calendar_url_title}",
"title": {exp:json_encode}{event_title}{/exp:json_encode},
"start": {exp:json_encode}{event_start_date format="%Y-%m-%dT%H:%i:%s"}{/exp:json_encode},
"end": {exp:json_encode}{event_end_date format="%Y-%m-%dT%H:%i:%s"}{/exp:json_encode},
"allDay": {if occurrence_all_day}true{if:else}false{/if},
"url_title": {exp:json_encode}{event_url_title}{/exp:json_encode},
"url": {exp:json_encode}/calendar/event-entry-form/{event_start_date format="%U"}/{event_start_date format="%U"}/{event_id}{/exp:json_encode},
"icon": {exp:json_encode}{my_calendar_icon}{/exp:json_encode},
{if event_multi_day}
"color": {exp:json_encode}#{my_calendar_color}{/exp:json_encode},
"textColor": {exp:json_encode}{exp:projects:contrasting_text_color hexcolor="{my_calendar_color}"}{/exp:json_encode},
{if:else}
"color": "#FFFFFF",
"textColor": {exp:json_encode}#{my_calendar_color}{/exp:json_encode},
{/if}
"className": "{exp:tagger:tags entry_id='{entry_id}'}tag-{tagger:urlsafe_tagname} {/exp:tagger:tags}"
}
{/exp:stash:get_list}
{/exp:calendar:cal}
]
Here, I'm using a combination of other addons, like 'HTTP Header' by Rob Sanchez, JSON Encode by NobleStudios, and most importantly, Stash by Mark Croxton.