BUG: Fixed bug when creating new column with missing values when setting a single string value
- [ ] closes #56204 (Replace xxxx with the GitHub issue number)
- [ ] [Tests added and passed](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#writing-tests) if fixing a bug or adding a new feature
- [ ] All [code checks passed](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#pre-commit).
- [ ] Added [type annotations](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#type-hints) to new arguments/methods/functions.
- [ ] Added an entry in the latest `doc/source/whatsnew/vX.X.X.rst` file if fixing a bug or adding a new feature.

thanks for your reviews! have updated Just tracked down an old branch where past-me was trying to get rid of infer_fill_value.  The only recoverable bit of that branch looks like it would go just before L1880 in indexing.py

```
                        elif not is_list_like(value):
                            # Find our empty_value dtype by constructing an array
                            #  from our value and doing a .take on it
                            arr = sanitize_array(value, Index(range(1)), copy=False)
                            taker = -1 * np.ones(len(self.obj), dtype=np.intp)
                            empty_value = algos.take_nd(arr, taker)
                            self.obj[key] = empty_value
```

would that solve the issue here robustly?  i like past-me's idea of using sanitize_array rather than yet-another constructor-esque function That would also avoid the warning when expanding column-wise:

main:
```python
In [1]: df = pd.DataFrame({'a': [.1, .2], 'b': [.3, .4]})

In [2]: df.loc[1, 'c'] = True
<ipython-input-2-d3d953ae007a>:1: FutureWarning: Setting an item of incompatible dtype is deprecated and will raise in a future error of pandas. Value 'True' has dtype incompatible with float64, please explicitly cast to a compatible dtype first.
  df.loc[1, 'c'] = True

In [3]: df
Out[3]: 
     a    b     c
0  0.1  0.3   NaN
1  0.2  0.4  True

In [4]: df.dtypes
Out[4]: 
a    float64
b    float64
c     object
dtype: object
```
here:
```python
In [1]: df = pd.DataFrame({'a': [.1, .2], 'b': [.3, .4]})

In [2]: df.loc[1, 'c'] = True

In [3]: df
Out[3]: 
     a    b     c
0  0.1  0.3   NaN
1  0.2  0.4  True

In [4]: df.dtypes
Out[4]: 
a    float64
b    float64
c     object
dtype: object
``` thanks for your reviews! merging then