Yes, you can for example write a custom quest action and add it to the quest's Success node(s). Your custom quest action script can hold user data. To make a custom quest action, duplicate QuestActionTemplate.cs and rename the duplicate to YourActionNameQuestAction.cs, where YourActionName is the name you want to give to the open. Then edit the script, rename the class to YourActionName, and add your code where the comments indicate.
var sampleQuestAction = quest.GetStateInfo(quest.GetState()).actionList.OfType<SampleQuestAction>().FirstOrDefault();
Debug.Log(sampleQuestAction?.HelloWorld);
Is there any better way?
and,
I want to have common userdata no matter what state the quest is in. In this case, can I just set a rule (ex. always put quest reward data in WaitingToStart) and use it?
In that case, you can write a custom QuestAction or QuestContent to put store a reference to the ScriptableObject asset in the main quest info's Actions or a UI content section.
For example, say you create a script named MyCustomDataQuestAction and put it in the quest's Active state > Actions section. Then you can get it like this:
var activeState = quest.GetStateInfo(QuestState.Active);
var actionList = activeState.actionList;
var myAction = actionList.Find(action => action is MyCustomDataQuestAction);
var myData = myData.customData;