Create monthly calendar with number of days and offset (day of week) as user input
First Welcome to Code Review, and nice first question for a beginner. You did
a good job with variable names, function names, comments and indentation,
although validInput = true; is incorrectly indented in both functions. The
function drawCalendar() is very inconsistent in the indentation.

Consider the User
You might want to add an error message such as
"Invalid input please enter a number between X and Y" with X being the lower
limit and Y being the upper limit.

DRY Principle
There is a software engineering principle call the Don't Repeat Yourself
principle that may apply to the two input functions. Well written functions
can be used in multiple places in code and decrease the amount of code
necessary to implement a program or library. This code count contain a
function called getInput() that implements most of getInputDays() and
a lot of getInputOffset()

int getInput(string inputPrompt, int lowerBound, int upperBound)
{
  int inputValue = 0;
  bool validInput = false; // used to verify input is valid
  while (validInput == false)
  {
    std::cout &lt;&lt; inputPrompt &lt;&lt; " : ";
    std::cin &gt;&gt; InputValue;
    if (inputValue &gt;= lowerBound &amp;&amp; inputValue &lt;= upperBound)
    {
      validInput = true;
    }
    else
    {
      std::cout &lt;&lt; "Invalid input, please enter a number between"
          &lt;&lt; lowerBound &lt;&lt; " and " &lt;&lt; upperBound &lt;&lt; "\n";
    }
  }
  return InputValue;
}


Reducing the amount of code is a benefit because it makes it easier to
write the code in the first place, modify the code later and debug the
code.

You did well following another software engineering called the Single
Responsibility Principle.
The single responsibility principle states that every module or class should
have responsibility over a single part of the functionality provided by the
software, and that responsibility should be entirely encapsulated by the
class. All its services should be narrowly aligned with that responsibility.

When raw numbers are included in code they can often be confusing. Also if
the same number is used multiple times in the code for the same reason,
such as for array bounds it is easier to understand the code and modify
the code using symbolic constants. Some examples that might apply to
this program

//Symbolic constants should be capitalized, multiple words separated
// by underscore.
constexpr int SHORT_MONTH = 28;
constexpr int LONG_MONTH = 31;
constexpr int SUNDAY = 6;
constexpr int MONDAY = 0;
constexpr int TUESDAY = 1;
constexpr int SPACES_IN_COLUMN = 4;


Switch Statement Versus if then else if
The function displayOffset() could be implemented in the following manner:

void displayOffset(int offset)
// used to create offset on the first line of calendar
{
  switch (offset == 1)
    case TUESDAY :
      std::cout &lt;&lt; "       1";
      break;
    case WEDNESDAY :
      std::cout &lt;&lt; "           1";
      break;
   ...
  }
}


This is somewhat more readable and maintainable that multiple if then else if
statements. It is much easier to add a new case than it is to add a new
else if statement.

Another alternative would be:  

void displayOffset(int offset)
// used to create offset on the first line of calendar
{
  for (int i = 0; i &lt; offset * SPACES_IN_COLUMN; i++)
  {
    std::count &lt;&lt; " ";
  }
}


Complex Functions
It might be easier to understand, debug and modify the drawCalendar()
function if it was broken up into sub-functions following the Single
Responsibility Principle mentioned above.